找回密码
 立即注册
首页 业界区 业界 Django+DRF 实战:自定义异常处理流程

Django+DRF 实战:自定义异常处理流程

恃液 昨天 15:43
一、DRF 异常处理流程

DRF 默认异常处理流程

DRF默认的异常处理流程如下:

  • 当异常发生时,会自动调用rest_framework.views.exception_handler 函数来处理异常。
  • 该函数对DRF异常(即继承了APIException 类)和Django内置的Http404、PermissionDenied异常,提取错误信息并返回响应
  • 其它异常不处理,返回None(抛出到外层)。
源码

下面是DRF的exception_handler 异常处理函数源码
  1. # rest_framework.views.py
  2. def exception_handler(exc, context):
  3.     if isinstance(exc, Http404):
  4.         exc = exceptions.NotFound(*(exc.args))
  5.     elif isinstance(exc, PermissionDenied):
  6.         exc = exceptions.PermissionDenied(*(exc.args))
  7.     if isinstance(exc, exceptions.APIException):
  8.         headers = {}
  9.         if getattr(exc, 'auth_header', None):
  10.             headers['WWW-Authenticate'] = exc.auth_header
  11.         if getattr(exc, 'wait', None):
  12.             headers['Retry-After'] = '%d' % exc.wait
  13.         if isinstance(exc.detail, (list, dict)):
  14.             data = exc.detail
  15.         else:
  16.             data = {'detail': exc.detail}
  17.         set_rollback()
  18.         return Response(data, status=exc.status_code, headers=headers)
  19.     return None
复制代码
二、实战

DRF 自定义异常处理流程

DRF 自定义异常处理流程示例:

  • 定义custom_exception_handler函数,作为DRF的全局异常处理器
  • 该函数记录详细的错误日志,包括用户、IP、请求路径、方法、视图及异常信息。然后,统一返回错误响应格式

    • 若异常未被 DRF 捕获,返回 500 错误或特定 ProtectedError 提示
    • 若为 DRF 的 ValidationError 或 Django 的验证错误,调用对应处理函数提取错误信息
    • 其他异常则根据状态码返回预定义的友好提示

1.png

应用自定义异常处理流程

在 settings.py 中,配置DRF自定义异常处理函数,作为全局异常处理器。
  1. REST_FRAMEWORK = {
  2.     # ...
  3.     # 全局异常处理
  4.     "EXCEPTION_HANDLER": "mars_framework.exceptions.base.custom_exception_handler",
  5.     # ...
  6. }
复制代码
点击查看完成代码
您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册