【django】4.0版本使用多环境下restframework坑

本文记录了在Django 4.0版本中集成Django Rest Framework (DRF) 和 Django REST framework JWT时遇到的问题及解决办法。主要介绍了配置冲突导致的TypeError错误、版本兼容性问题以及如何修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

django4.0版本使用多环境下restframework巨坑!

0).背景

  • 最近在使用django重构之前的老项目,该项目包含四个环境的配置文件
  • 于是极为省力的使用了pip install django,结果发现django已经升级到4.1.4了,接着我很自信的开始runserver,结果就是一堆报错,以下记录我在使用中的一些错误,希望对你们有用!
  • 持续更新!!!
    在这里插入图片描述
# DRF配置项
REST_FRAMEWORK = {
    'UNICODE_JSON': True,
    # 异常处理
    "EXCEPTION_HANDLER": "meiduo_mall.utils.exceptions.exception_handler",
    # JWT
    'DEFAULT_PERMISSION_CLASSES': ( # 设置所有接口使用JWT进行权限验证
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': ( # 用户登陆认证方式
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    )
},
JWT_AUTH = {
    # token 有效期
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    # 开启Token更新
    'JWT_ALLOW_REFRESH': True,
    # 续期有效期(该设置可在24小时内带未失效的token进行续期) 
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(hours=24)
}

1). djangorestframework-jwt使用导致元祖的索引为str

  1. 使用restframework以及restframework-jwt后,无法启动项目,报错信息: TypeError: tuple indices must be integers or slices, not str,通过报错信息的行数找到包:restframework.settings
    在这里插入图片描述

  2. 主要报错信息在val=self.user_settings[attr],这时候我们打印self.user_settings信息,发现读取settings文件的内容格式已经转为tuple[dict],attr为我们在配置项中设置的key值,显然源码的getattr魔法中通过tuple获取key值是错误的(这里也没有做对应的except处理)

  3. 将val=self.user_settings[attr]修改为val=self.user_settings[0][attr],我以为到这里就结束了…

  4. 重新runserver,发现有两个包在version>django4.0被移除
    在这里插入图片描述
    在这里插入图片描述

  5. 在settings下重新指定smart_text
    在这里插入图片描述

  6. 注释源码中的from django.utils.translation import ugettext as _ 改为from django.utils.translation import gettext_lazy as _ (ps: 修改的地方有两个,都在上图)

  7. 重新runserver
    在这里插入图片描述

  8. 测试
    在这里插入图片描述将相关代码注释掉,发现jwt认证已经生效

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值