文章目录
- 一、DRF 异常处理流程
- DRF 默认异常处理流程
- 源码
- 二、实战
- DRF 自定义异常处理流程
- 应用自定义异常处理流程
一、DRF 异常处理流程
DRF 默认异常处理流程
DRF默认的异常处理流程如下:
- 当异常发生时,会自动调用
rest_framework.views.exception_handler
函数来处理异常。 - 该函数对DRF异常(即继承了
APIException
类)和Django内置的Http404、PermissionDenied
异常,提取错误信息并返回响应 - 其它异常不处理,返回None(抛出到外层)。
源码
下面是DRF的exception_handler
异常处理函数源码
# rest_framework.views.py
def exception_handler(exc, context):if isinstance(exc, Http404):exc = exceptions.NotFound(*(exc.args))elif isinstance(exc, PermissionDenied):exc = exceptions.PermissionDenied(*(exc.args))if isinstance(exc, exceptions.APIException):headers = {}if getattr(exc, 'auth_header', None):headers['WWW-Authenticate'] = exc.auth_headerif getattr(exc, 'wait', None):headers['Retry-After'] = '%d' % exc.waitif isinstance(exc.detail, (list, dict)):data = exc.detailelse:data = {'detail': exc.detail}set_rollback()return Response(data, status=exc.status_code, headers=headers)return None
二、实战
DRF 自定义异常处理流程
DRF 自定义异常处理流程示例:
- 定义
custom_exception_handler
函数,作为DRF的全局异常处理器 - 该函数记录详细的错误日志,包括用户、IP、请求路径、方法、视图及异常信息。然后,统一返回错误响应格式
- 若异常未被 DRF 捕获,返回 500 错误或特定 ProtectedError 提示
- 若为 DRF 的
ValidationError
或 Django 的验证错误,调用对应处理函数提取错误信息 - 其他异常则根据状态码返回预定义的友好提示
应用自定义异常处理流程
在 settings.py
中,配置DRF自定义异常处理函数,作为全局异常处理器。
REST_FRAMEWORK = {# ...# 全局异常处理"EXCEPTION_HANDLER": "mars_framework.exceptions.base.custom_exception_handler",# ...
}
点击查看完成代码
您正在阅读的是《Django从入门到实战》专栏!关注不迷路~