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
-
使用restframework以及restframework-jwt后,无法启动项目,报错信息: TypeError: tuple indices must be integers or slices, not str,通过报错信息的行数找到包:restframework.settings
-
主要报错信息在val=self.user_settings[attr],这时候我们打印self.user_settings信息,发现读取settings文件的内容格式已经转为tuple[dict],attr为我们在配置项中设置的key值,显然源码的getattr魔法中通过tuple获取key值是错误的(这里也没有做对应的except处理)
-
将val=self.user_settings[attr]修改为val=self.user_settings[0][attr],我以为到这里就结束了…
-
重新runserver,发现有两个包在version>django4.0被移除
-
在settings下重新指定smart_text
-
注释源码中的from django.utils.translation import ugettext as _ 改为from django.utils.translation import gettext_lazy as _ (ps: 修改的地方有两个,都在上图)
-
重新runserver
-
测试
将相关代码注释掉,发现jwt认证已经生效