Django RestFramework 全局异常处理详解
本文详细介绍 Django RestFramework 的全局异常处理机制。内容涵盖 DRF 内置异常类的分类与用途,以及如何通过自定义 exception_handler 函数统一捕获并格式化错误响应。同时提供在 settings.py 中注册自定义处理器的具体配置方法,帮助开发者实现规范化的 API 错误返回。
REST framework 定义了一系列内置异常类,用于处理 API 开发中常见的错误场景。
APIException是所有 REST framework 异常的基类,其他具体异常均继承自该类。ParseError表示请求数据解析失败,通常发生在 JSON 格式错误或内容类型不匹配时。AuthenticationFailed代表认证失败,即用户提供的凭证无效或无法通过身份验证。NotAuthenticated表示尚未进行认证,请求中缺少必要的认证信息。PermissionDenied表示权限被拒绝,用户已通过认证但无权访问当前资源或执行该操作。NotFound表示未找到请求的资源,通常对应 HTTP 404 状态码。MethodNotAllowed表示请求的 HTTP 方法不被当前视图支持,例如对只读接口使用 POST 请求。NotAcceptable表示客户端请求的数据格式不被服务器接受,通常与 Accept 头相关。Throttled表示请求频率超过限流设置,触发频率限制机制。ValidationError表示数据校验失败,例如字段缺失、类型错误或违反约束条件。
要实现全局异常处理,首先需要定义一个自定义的异常处理函数。该函数接收异常对象和上下文信息,并返回标准化的响应。
from django.http import JsonResponse
from rest_framework.views import exception_handler as drf_exception_handler
import logging
from django.db import DatabaseError
from redis.exceptions import RedisError
import traceback
# 获取在配置文件中定义的logger,用来记录日志
logger = logging.getLogger('django')
def exception_handler(exc, context):
"""
自定义异常处理
:param exc: 异常
:param context: 抛出异常的上下文(包含request请求对象和view视图对象)
:return: Response响应对象
"""
# 调用drf框架原生的异常处理方法
response = drf_exception_handler(exc, context)
if response is not None:
logger.info('REST_FRAMEWORK处理异常')
# 使用自定义封装好的方法处理数据格式并返回给前端
return response_util.success(response)
view = context['view']
# 打印异常类以及异常的文本信息
logger.error('[%s] %s' % (view, exc))
returnData = {
'code': 500,
'msg': '服务器错误',
'data': ""
}
# 捕获其他异常,直接返回 500
if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):
# 数据库异常,使用traceback.format_exc()可以像系统报错没拦截那样子打印详细错误信息又不会导致程序停止
logger.error(f'其他未知错误:{traceback.format_exc()}')
# 使用django原生的响应对象返回,不能用DRF框架的响应对象
return JsonResponse(data=returnData, status=500)
else:
# 打印错误详细信息
logger.error(f'其他未知错误:{traceback.format_exc()}')
# 使用django原生的响应对象返回,不能用DRF框架的响应对象
return JsonResponse(data=returnData, status=500)
定义好处理函数后,需在 DRF 配置中将其注册为默认的异常处理器,使其生效。
在 settings.py 文件中,通过配置 REST_FRAMEWORK 字典的 EXCEPTION_HANDLER 键来指定自定义处理器的路径。
REST_FRAMEWORK = {
# 异常处理
'EXCEPTION_HANDLER': 'meiduo_service.utils.excepitons.exception_handler',
}
修改 Django 默认的错误处理方式,将错误处理逻辑替换为自定义的中间件或处理器。虽然实现类和配置方式不同,但核心处理思路一致,即统一捕获异常并返回格式化的响应。
通过上述步骤,即可完成 Django RestFramework 的全局异常处理配置。
本文介绍了 Django RestFramework 全局异常处理的核心概念与实现方法,希望能为您的开发工作提供帮助。欢迎持续关注本站以获取更多技术内容。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













