You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重写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异常处理器:

  1. 首先创建自定义异常处理函数,可放在项目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
  1. 在项目settings.py中配置DRF使用自定义异常处理器:
REST_FRAMEWORK = {
    # 替换为你项目中自定义异常处理函数的实际路径
    'EXCEPTION_HANDLER': 'your_project.utils.exception_handler.custom_jwt_exception_handler',
}

内容的提问来源于stack exchange,提问作者Clark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:27:01