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
相关产品推荐
相关产品推荐

