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

一、DRF 异常处理流程

DRF 默认异常处理流程

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

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

源码

下面是DRF的exception_handler 异常处理函数源码

python 复制代码
# 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_header
        if getattr(exc, 'wait', None):
            headers['Retry-After'] = '%d' % exc.wait

        if isinstance(exc.detail, (list, dict)):
            data = exc.detail
        else:
            data = {'detail': exc.detail}

        set_rollback()
        return Response(data, status=exc.status_code, headers=headers)

    return None

二、实战

DRF 自定义异常处理流程

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

  1. 定义custom_exception_handler函数,作为DRF的全局异常处理器
  2. 该函数记录详细的错误日志,包括用户、IP、请求路径、方法、视图及异常信息。然后,统一返回错误响应格式
    • 若异常未被 DRF 捕获,返回 500 错误或特定 ProtectedError 提示
    • 若为 DRF 的 ValidationError 或 Django 的验证错误,调用对应处理函数提取错误信息
    • 其他异常则根据状态码返回预定义的友好提示

应用自定义异常处理流程

settings.py 中,配置DRF自定义异常处理函数,作为全局异常处理器。

python 复制代码
REST_FRAMEWORK = {
    # ...
    # 全局异常处理
    "EXCEPTION_HANDLER": "mars_framework.exceptions.base.custom_exception_handler",
    # ...
}

点击查看完成代码


您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

相关推荐
半夏知半秋18 分钟前
redis-哨兵模式配置整理
数据库·redis·笔记·后端·学习·lua·安全架构
草莓熊Lotso20 分钟前
模板进阶:从非类型参数到分离编译,吃透 C++ 泛型编程的核心逻辑
linux·服务器·开发语言·c++·人工智能·笔记·后端
JaguarJack27 分钟前
2025 年必须尝试的 5 个 Laravel 新特性
后端·php·laravel
程序员爱钓鱼30 分钟前
Python编程实战 - Python基础入门 - 容器的常用操作与应用
后端·python·bpython
程序员爱钓鱼33 分钟前
Python编程实战 - 函数与模块化编程 - 函数的定义与调用
前端·后端·python
欧阳码农33 分钟前
使用AI生成的页面总是被一眼认出来怎么办?1分钟给你解决
前端·后端
IT_陈寒40 分钟前
7个鲜为人知的JavaScript性能优化技巧,让你的应用提速50%!
前端·人工智能·后端
lang201509281 小时前
Spring Boot与K8s集成的核心机制
spring boot·后端·kubernetes
superlls1 小时前
(场景题)Java 导出 Excel 的两种方式
java·开发语言·后端·excel
绝无仅有1 小时前
某银行大厂面试技术问题深度解析(一)
后端·面试·github