自定義Django_rest_framework_jwt登陸錯誤回傳
文章 :這位博主的方法是對的,但是修改原始碼,個人是非常不贊同的,我就自己按照這位博主重寫了登錄錯誤回傳
# urls.py
# 這是我們的路由
from rest_framework_jwt import views
urlpatterns = [
# 獲取
path('api-token-auth/', views.obtain_jwt_token),
# 重繪
path('api-token-refresh/', views.refresh_jwt_token),
# 校驗
path('api-token-verify/', views.verify_jwt_token),
]
我發現jwt的回傳都是由JSONWebTokenAPIView來控制的,我打算改一下里面的post方法
# utils.py
from rest_framework import status
from rest_framework.response import Response
from rest_framework_jwt.settings import api_settings
from rest_framework_jwt.views import JSONWebTokenAPIView, ObtainJSONWebToken, RefreshJSONWebToken, VerifyJSONWebToken
from datetime import datetime
class MyJSONWebTokenAPIView(JSONWebTokenAPIView):
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 = jwt_response_payload_handler(token, user, request)
response = Response(response_data)
if api_settings.JWT_AUTH_COOKIE:
expiration = (datetime.utcnow() +
api_settings.JWT_EXPIRATION_DELTA)
response.set_cookie(api_settings.JWT_AUTH_COOKIE,
token,
expires=expiration,
httponly=True)
return response
error_data = jwt_response_payload_error_handler(serializer, request)
return Response(error_data, status=status.HTTP_200_OK)
def jwt_response_payload_handler(token, user=None, request=None):
# 自定義回傳 JWT
return {
"msg": "success",
"status": 200,
"data": [{
# data自定義你介面想回傳的資訊
'token': token,
'username': user.username
}]
}
def jwt_response_payload_error_handler(serializer, request=None):
return return {
"msg": "用戶名或者密碼錯誤",
"status": 400,
"detail": serializer.errors
}
class MyObtainJSONWebToken(ObtainJSONWebToken, MyJSONWebTokenAPIView):
pass
class MyRefreshJSONWebToken(RefreshJSONWebToken, MyJSONWebTokenAPIView):
pass
class MyVerifyJSONWebToken(VerifyJSONWebToken, MyJSONWebTokenAPIView):
pass
obtain_jwt_token = MyObtainJSONWebToken.as_view()
refresh_jwt_token = MyRefreshJSONWebToken.as_view()
verify_jwt_token = MyVerifyJSONWebToken.as_view()
# urls.py
from apps.user.restful import utils
urlpatterns = [
# 獲取
path('api-token-auth/', utils.obtain_jwt_token),
# 重繪
path('api-token-refresh/', utils.refresh_jwt_token),
# 校驗
path('api-token-verify/', utils.verify_jwt_token),
]
這樣就避免了修改原始碼,到時候云上不同步才是大坑
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/179102.html
標籤:其他
下一篇:力扣每日一題(1)
