如何重写Django SimpleJWT自定义令牌视图的401 Unauthorized响应
方案1:仅针对当前自定义的令牌获取视图修改401响应
直接在你已有的ObtainToken视图类中重写post方法,捕获认证失败的异常后返回自定义格式的响应即可,修改后完整代码如下:
from rest_framework import status from rest_framework.response import Response from rest_framework_simplejwt.exceptions import AuthenticationFailed from rest_framework_simplejwt.serializers import TokenObtainPairSerializer from rest_framework_simplejwt.views import TokenObtainPairView class ObtainTokenSerializer(TokenObtainPairSerializer): @classmethod def get_token(cls, user): token = super().get_token(user) # 自定义令牌声明 token['name'] = user.first_name return token class ObtainToken(TokenObtainPairView): serializer_class = ObtainTokenSerializer def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) try: serializer.is_valid(raise_exception=True) except AuthenticationFailed: # 此处可完全自定义401响应的返回结构和内容 return Response( { "code": 401001, "msg": "账号或密码错误,请重新输入", "data": None }, status=status.HTTP_401_UNAUTHORIZED ) return Response(serializer.validated_data, status=status.HTTP_200_OK)
方案2:全局修改所有simplejwt相关的401响应
如果你需要统一修改全项目所有JWT认证相关的401响应格式,可以自定义DRF异常处理器:
- 首先创建自定义异常处理函数,可放在项目
utils目录下的exception_handler.py文件中:
from rest_framework.views import exception_handler from rest_framework.response import Response from rest_framework import status from rest_framework_simplejwt.exceptions import AuthenticationFailed, InvalidToken, TokenError def custom_jwt_exception_handler(exc, context): # 先调用DRF默认的异常处理器获取标准响应 response = exception_handler(exc, context) # 匹配JWT相关的认证异常,自定义返回格式 if isinstance(exc, (AuthenticationFailed, InvalidToken, TokenError)): return Response( { "code": 401000, "msg": "身份凭证无效或已过期,请重新登录", "data": None }, status=status.HTTP_401_UNAUTHORIZED ) return response
- 在项目
settings.py中配置DRF使用自定义异常处理器:
REST_FRAMEWORK = { # 替换为你项目中自定义异常处理函数的实际路径 'EXCEPTION_HANDLER': 'your_project.utils.exception_handler.custom_jwt_exception_handler', }
内容的提问来源于stack exchange,提问作者Clark
相关产品推荐
相关产品推荐

