一、认识session与token
这里就直接引用别人的文章,不做过多说明
网络应用中session和token本质是一样的吗,有什么区别? - 知乎
二、token响应定制
在全局配置表中配置
'DEFAULT_AUTHENTICATION_CLASSES': [
# 指定jwt Token认证
'rest_framework_jwt.authentication.JSONWebTokenAuthentication'
rest_framework_jwt/views.py中
查看ObtainJSONWebToken类:
发现里面引用了JSONWebTokenSerializer序列化器类
users应用的url.py
引用obtain_jwt_token
from django.urls import path
from interfaces import views
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token)
]
发现rest_framework_jwt/views.py中有提供post方法:
登录之后发现输出只有返回token字段
如果我们想让user_id和user_name也输出的话,我们就要定制输出了
查看rest_framework_jwt/views.py中post方法里面有调用jwt_response_payload_handler方法
如果不需要改写,可以在项目setting.py文件中直接引用
JWT_AUTH={
'JWT_RESPONSE_PAYLOAD_HANDLER':
'rest_framework_jwt.utils.jwt_response_payload_handler',
}
终于在rest_framework_jwt.utils.py文件中发现了jwt_response_payload_handler
所以我们要改写这个方法:
本地项目的utils文件夹中新建一个handler_jwt_response.py
def jwt_response_payload_handler(token, user=None, request=None):
"""
Returns the response data for both the login and refresh views.
Override to return a custom response such as including the
serialized representation of the User.
Example:
def jwt_response_payload_handler(token, user=None, request=None):
return {
'token': token,
'user': UserSerializer(user, context={'request': request}).data
}
"""
return {
'user_id': user.id,
'user_name': user.username,
'token': token
}
改写之后,还要在全局配置表里修改引用路径
JWT_AUTH={
'JWT_RESPONSE_PAYLOAD_HANDLER':
# 'rest_framework_jwt.utils.jwt_response_payload_handler',
'utils.handler_jwt_response.jwt_response_payload_handler',
}
运行得到想要的结果