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

DRF视图身份验证失败时如何自定义未授权错误响应?

自定义DRF未授权请求错误响应的实现方案

针对JWT认证场景下,请求未通过身份校验时返回DRF默认错误页面的问题,可以通过全局自定义异常处理的方式统一替换响应格式,不需要逐视图修改逻辑,具体步骤如下:

1. 编写自定义异常处理函数

在项目的工具类目录(比如utils/exceptions.py)中编写适配的异常处理逻辑,核心是基于DRF内置的异常处理流程做拦截重写:

from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework.exceptions import AuthenticationFailed, PermissionDenied

def custom_unauthorized_exception_handler(exc, context):
    # 调用DRF默认异常处理逻辑,拿到基础响应对象
    response = exception_handler(exc, context)

    if response is None:
        return response

    # 针对401未授权(身份校验失败)场景自定义响应
    if isinstance(exc, AuthenticationFailed):
        return Response(
            data={
                "err_code": 40101,
                "err_msg": "身份凭证无效或已过期,请重新携带合法令牌请求",
                "result": None
            },
            status=401
        )
    
    # 针对403无权限场景自定义响应
    if isinstance(exc, PermissionDenied):
        return Response(
            data={
                "err_code": 40301,
                "err_msg": "当前账号无权限访问该接口资源",
                "result": None
            },
            status=403
        )

    return response

2. 全局注册自定义异常处理器

在项目的settings.py中,找到DRF的全局配置块REST_FRAMEWORK,新增异常处理器的配置路径:

REST_FRAMEWORK = {
    # 保留原有项目的认证、权限类配置(包括JWTTokenUserAuthentication、IsAuthenticated的全局配置)
    "EXCEPTION_HANDLER": "你的项目根目录.utils.exceptions.custom_unauthorized_exception_handler"
}

方案说明

  • 配置完成后,所有走DRF请求链路的未授权请求,都会返回自定义的JSON结构,替代原来的DRF默认HTML错误页面,你代码中写的home_view不需要做任何额外修改就能自动生效
  • 如果需要做更细分的错误提示(比如区分令牌缺失、令牌过期、令牌签名错误等不同JWT异常场景),可以在异常处理函数中通过判断抛出的异常具体类型,返回对应更精准的提示信息
  • 若仅需要给单个视图定制特殊的未授权响应,可以跳过全局配置,在视图函数内部手动捕获对应校验异常后返回自定义响应,但该方式可维护性低于全局统一配置的方案

内容的提问来源于stack exchange,提问作者vivek kumar choubey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 00:45:05