
正文
Django REST Framework JWT提供的登录签发的视图
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Django REST Framework JWT提供了一个视图。在我们登录的时候,会 校验用户名、密码是否正确 。如果信息无误,可以 返回一个JWT token 。就可以简单地实现了记录用户登录状态。
用法:
只需要在路由配置一下即可:
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns=[
...
url(r'login$',obtain_jwt_token)
]
这样就可以实现登录之后,返回JWT token了。
至于obtain_jwt_token是怎么实现校验和返回JWT token的功能的呢?
可以看一下源码,我简单看了下,原理大体如下:
# 真正起作用的是ObtainJSONWebToken视图
obtain_jwt_token = ObtainJSONWebToken.as_view() # (点进ObtainJSONWebToken)
# ObtainJSONWebToken是一个DRF子类视图
class ObtainJSONWebToken(JSONWebTokenAPIView):
# JSONWebTokenSerializer先通过django的设置文件获取到用户的模型类,然后获取到模型类的用户名字段。然后自己建立一个序列化器,包括用户名、密码字段。
serializer_class = JSONWebTokenSerializer # (点进JSONWebTokenAPIView)
class JSONWebTokenAPIView(APIView):
def post(self, request, *args, **kwargs):
# 取得自己建立的序列化器
serializer = self.get_serializer(data=request.data)
# 校验成功后的操作
if serializer.is_valid():
user = serializer.object.get('user') or request.user
token = serializer.object.get('token')
# response_data就是返回的数据。
response_data = jwt_response_payload_handler(token, user, request)
response = Response(response_data)
...
...
return response return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # (搜索jwt_response_payload_handler)
# 可以看到jwt_response_payload_handler返回一个字典,包含着JWT token
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 {
'token': token
}
这就是实现登录后自动返回token的原理。
-
需求&解决
现在有一个需求,登录成功后,不仅仅返回JWT token,还要返回username和user_id。应该怎么修改呢?
如果认真看上面的源码,其实已经知道怎么解决了。
就是重写33行的jwt_response_payload_handler函数。
def jwt_response_payload_handler(token,user=None,request=None):
return {
"token":token,
"id":user.id,
"username":user.username
}
因为重写了方法,要应用我们自定义的方法,需要在django上进行设置。
JWT_AUTH = {
...
'JWT_RESPONSE_PAYLOAD_HANDLER': 'user.utils.jwt_response_payload_handler', # 应用登录返回token的自定义方法
}






