DRF 使用djangorestframework-jwt 报错

news/2025/2/16 6:38:53/

报错信息

 ImportError: Could not import 'rest_framework_jwt.authentication.JSONWebTokenAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ImportError: cannot import name 'smart_text' from 'django.utils.encoding'

原因

  • JSON Web Token不再维护,故不使用。
  • 官方建议的是使用simpleJWT认证

要求

官方文档:djangorestframework-jwt

  • Python (2.7, 3.3, 3.4, 3.5)
  • Django (1.8, 1.9, 1.10)
  • Django REST Framework (3.0, 3.1, 3.2, 3.3, 3.4, 3.5)
    在这里插入图片描述
    所以新版的django无法使用

解决方案

使用simplejwt

官方文档:djangorestframework-simplejwt

安装

pip install djangorestframework-simplejwt

配置

setting.py

# settings.py
INSTALLED_APPS = [...'rest_framework', 'rest_framework_simplejwt', 
]REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',),# 认证类# 先进行token的验证,如果没有携带token就进行session认证,如果没有session就就基本认证# 认证顺序是从上到下,需要哪个加哪个'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_simplejwt.authentication.JWTAuthentication','rest_framework.authentication.SessionAuthentication','rest_framework.authentication.BasicAuthentication',),
}
SIMPLE_JWT = {# token有效时长(返回的 access 有效时长)'ACCESS_TOKEN_LIFETIME': datetime.timedelta(seconds=30),# token刷新的有效时间(返回的 refresh 有效时长)'REFRESH_TOKEN_LIFETIME': datetime.timedelta(seconds=20),
}

urls.py

from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyViewurlpatterns = [path('authorizations/', TokenObtainPairView.as_view(), name='token_obtain_pair'),path('refresh/', TokenRefreshView.as_view(), name='token_refresh'),path('verify/', TokenVerifyView.as_view(), name='token_verify'),
]

或者
点源码进去看一样的

from rest_framework_simplejwt.views import token_obtain_pair, token_refresh, token_verifyurlpatterns = [path('authorizations/', token_obtain_pair, name='token_obtain_pair'),path('refresh/', token_refresh, name='token_refresh'),path('verify/', token_verify, name='token_verify'),
]
  • 登录接口,返回refresh和access值
  • refresh用来刷新获取新的Token值
  • access用来请求身份认证的Token
  • access的过期时间参照配置ACCESS_TOKEN_LIFETIME
  • refresh的过期时间参照配置REFRESH_TOKEN_LIFETIME
  • 当用refresh刷新后,access的过期时间等于【当前刷新的此刻时间+ACCESS_TOKEN_LIFETIME】

其他设置

# Django project settings.pyfrom datetime import timedelta
...SIMPLE_JWT = {"ACCESS_TOKEN_LIFETIME": timedelta(minutes=5),"REFRESH_TOKEN_LIFETIME": timedelta(days=1),"ROTATE_REFRESH_TOKENS": False,"BLACKLIST_AFTER_ROTATION": False,"UPDATE_LAST_LOGIN": False,"ALGORITHM": "HS256","SIGNING_KEY": settings.SECRET_KEY,"VERIFYING_KEY": "","AUDIENCE": None,"ISSUER": None,"JSON_ENCODER": None,"JWK_URL": None,"LEEWAY": 0,"AUTH_HEADER_TYPES": ("Bearer",),"AUTH_HEADER_NAME": "HTTP_AUTHORIZATION","USER_ID_FIELD": "id","USER_ID_CLAIM": "user_id","USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule","AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),"TOKEN_TYPE_CLAIM": "token_type","TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser","JTI_CLAIM": "jti","SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp","SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),"SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),"TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer","TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer","TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer","TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer","SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer","SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
}

ACCESS_TOKEN_LIFETIME

datetime.timedelta指定访问令牌有效时间的对象。该timedelta值在令牌生成期间添加到当前 UTC 时间以获得令牌的默认“exp”声明值。

REFRESH_TOKEN_LIFETIME

datetime.timedelta指定刷新令牌有效时间的对象。该timedelta值在令牌生成期间添加到当前 UTC 时间以获得令牌的默认“exp”声明值。

ROTATE_REFRESH_TOKENS

设置为 时True,如果将刷新令牌提交给 TokenRefreshView,则新的刷新令牌将与新的访问令牌一起返回。这个新的刷新令牌将通过 JSON 响应中的“刷新”键提供。新的刷新令牌将有一个更新的到期时间,该时间是通过将设置中的 timedelta 添加REFRESH_TOKEN_LIFETIME 到发出请求时的当前时间来确定的。如果黑名单应用程序正在使用中并且BLACKLIST_AFTER_ROTATION设置为True,则提交到刷新视图的刷新令牌将被添加到黑名单中。

BLACKLIST_AFTER_ROTATION

设置为 时,如果黑名单应用程序正在使用且设置设置True为 ,则提交给 的刷新令牌 将被添加到黑名单。您需要在设置文件中添加才能使用此设置。 TokenRefreshViewROTATE_REFRESH_TOKENSTrue’rest_framework_simplejwt.token_blacklist’,INSTALLED_APPS

官方文档

详细请看官方文档:setting


http://www.ppmy.cn/news/35830.html

相关文章

【Spring Cloud Alibaba】9.分布式配置管理(Nacos Config)

文章目录简介分布式配置中心Nacos ConfigNacos设置微服务设置pom修改添加配置文件测试项目修改Nacos配置添加测试接口启动项目配置动态更新测试简介 接下来对分布式项目实现统一配置管理,本操作先要完成之前的步骤,详情请参照【Spring Cloud Alibaba】S…

(Java) 马虎的算式

题目描述: 小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。 有一次,老师出的题目是:36 x 495 ? 他却给抄成了:396 x 45 ? 但结果却很戏剧性,他的答案竟然是对的!&#xff…

【无标题】ES3J是什么二极管?参数特性怎么看?

二极管可以分为很多种类,有整流二极管、肖特基二极管、(超)快恢复二极管、开关二极管、TVS二极管、ESD静电保护二极管、发光二极管等等。那么,不同类型的二极管,它们之间有什么区别呢?接下来,东…

NVT | NT96660 NVTIPC库应用说明

NVT | NT96660 NVTIPC库应用说明 时间:2023-03-28 文章目录 NVT | `NT96660` NVTIPC库应用说明1.介绍2.特色3.消息队列框架4.使用4-1.IPC消息队列操作4-2.IPC信号操作4-3.IPC简单流程4-4.IPC简单代码eCos例程uITRON历程4-5.`IPC`系统命令4-5-1.开启一个`Linux`进程在`uITRON`…

countup.js 数字动画

countup.js 数字动画1. 安装2. 参数3. Vue组件封装3.1 组件代码3.2 调用方式1. 安装 npm i countup.js2. 参数 项目Valuetargetstring, HTMLElement ,HTMLInputElement - id of html element, input, svg text element, or DOM element reference where counting occursendV…

SAP 批量修改 工艺路线 和 BOM

1、在运维的过程中经常会遇到用户需要批量更改组件,或者是批量更改数量,还是组件里面的一些标识,当处理这些批量数据处理的业务时,BOM的批量更改一个想到的就是CS20,但是CS20当BOM需要替换的时候就不是很适用。新增的组…

js——proxy、Reflect中的receiver

proxy 一般情况 代码 let data{name:张三,age:12 } let proxyDatanew Proxy(data,{get(target,key,receiver){console.log(targetdata)console.log(receiverproxyData)console.log(targetreceiver)console.log(target,key,receiver)return target[key]},set(target,key,newV…

Baumer工业相机中偏振相机如何使用Baumer堡盟GAPI SDK来进行偏振数据的计算转换输出(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…