使用 djangorestframework-jwt 不需要定义视图函数吗?
一般情况下,DRF-JWT在登陆功能中应用最为广泛。而登陆视图的功能就是生成签证token ,然后将其返回给前端。
而生成签证token的事情,已有 djangorestframework-jwt
提供的 obtain_jwt_token
函数完成。
我们需要做的就是:补充一个函数用于处理返回值的格式,将 token 按照接口的格式返回给前端。做法就是通过 JWT_RESPONSE_PAYLOAD_HANDLER
配置项,指向自定义的函数。
obtain_jwt_token
进行关联。# urls.py
from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token # 导入 obtain_jwt_token
urlpatterns = [
path('api/login', obtain_jwt_token), # 路由关联视图
]
(1)根据接口文档,token 的前缀需要是 Bearer ,因此将 JWT_AUTH_HEADER_PREFIX
的值设置为 Bearer
。这样在解析 token 时,会自动去掉前缀。
(2)返回的 token 不可能是永久的,因此要给 token 设定过期时间。视图函数逻辑无法修改,我们可以通过 JWT_EXPIRATION_DELTA
配置项来完成设置。
# JWT认证的配置信息
JWT_AUTH = {
'JWT_AUTH_HEADER_PREFIX': 'Bearer', # JWT的前缀
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # JWT的过期时间
'JWT_RESPONSE_PAYLOAD_HANDLER': 'myserver.utils.jwt_response_payload_handler', # 请求成功的处理函数路径
}
注意点:
JWT_RESPONSE_PAYLOAD_HANDLER
的值,是你定义jwt_response_payload_handler
的路径。 比如:你的应用名字叫做myserver
,然后在此目录下的utils.py
文件中,定义jwt_response_payload_handler
函数来处理jwt请求成功的返回值。 那么JWT_RESPONSE_PAYLOAD_HANDLER
的值就是'myserver.utils.jwt_response_payload_handler'
.
(3) 最终返回给前端的格式,有自定义的函数完成。在自定义函数中重新封装返回值。
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt认证成功的返回数据格式
:param token:
:param user:
:param request:
:return:
"""
return {
'status': 0,
'message': '登陆成功!',
'token': f'Bearer {token}'
}
14