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

Django REST Framework全局自定义API响应失效问题求助

问题解决:JWT异常未按自定义API响应格式返回

核心原因

JWT令牌过期、无效这类认证异常,是在视图执行前的认证环节抛出的,默认DRF异常处理器处理这类异常时,生成的响应未经过你自定义的api_response格式化逻辑,导致格式不一致。

解决方案

修改自定义异常处理器,主动捕获JWT相关异常,并统一通过api_response返回格式;同时调整整体逻辑,确保所有异常都走自定义响应函数输出。

步骤1:导入所需依赖

在异常处理器文件中导入JWT异常类、DRF原生异常处理器及你的自定义响应函数:

from rest_framework_simplejwt.exceptions import TokenExpiredError, InvalidToken, AuthenticationFailed
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from .utils import api_response  # 替换为你的api_response实际路径

步骤2:重写异常处理器

更新custom_exception_handler逻辑,优先拦截JWT异常,再统一处理其他异常:

def custom_exception_handler(exc, context):
    # 优先处理JWT相关认证异常
    if isinstance(exc, TokenExpiredError):
        return api_response(
            success=False,
            message="令牌已过期,请重新登录",
            status_code=status.HTTP_401_UNAUTHORIZED
        )
    elif isinstance(exc, InvalidToken):
        return api_response(
            success=False,
            message="无效的令牌",
            status_code=status.HTTP_401_UNAUTHORIZED
        )
    elif isinstance(exc, AuthenticationFailed):
        return api_response(
            success=False,
            message=str(exc),
            status_code=status.HTTP_401_UNAUTHORIZED
        )
    
    # 处理DRF默认捕获的其他异常(如序列化器错误)
    response = drf_exception_handler(exc, context)
    if response is not None:
        return api_response(
            success=False,
            message=response.data.get('detail', '请求处理失败'),
            error=response.data if 'detail' not in response.data else None,
            status_code=response.status_code
        )
    
    # 处理DRF无法捕获的原生Python异常
    return api_response(
        success=False,
        message=str(exc),
        status_code=status.HTTP_500_INTERNAL_SERVER_ERROR
    )

步骤3:确认配置正确性

确保settings.py中异常处理器路径无误:

REST_FRAMEWORK = {
    # ...其他配置项
    'EXCEPTION_HANDLER': 'backend.exceptions.custom_exception_handler',
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

关键说明

  • 主动拦截JWT异常:这类异常在视图执行前抛出,默认处理逻辑不会适配你的自定义格式,因此需要直接捕获并返回统一响应。
  • 统一用api_response输出:所有异常最终都通过自定义响应函数返回,从根源保证格式一致。
  • 保留错误细节:对于序列化器多字段错误等场景,将原始错误数据传入error参数,确保信息完整性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:28:21