一、DRF 异常处理流程

DRF 默认异常处理流程

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

  1. 当异常发生时,会自动调用rest_framework.views.exception_handler 函数来处理异常。
  2. 该函数对DRF异常(即继承了APIException 类)和Django内置的Http404、PermissionDenied异常,提取错误信息并返回响应
  3. 其它异常不处理,返回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_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自定义异常处理函数,作为全局异常处理器。

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

点击查看完成代码


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

Django+DRF 实战:自定义异常处理流程的更多相关文章

  1. 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解

    ========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...

  2. Spring Cloud实战 | 第九篇:Spring Cloud整合Spring Security OAuth2认证服务器统一认证自定义异常处理

    本文完整代码下载点击 一. 前言 相信了解过我或者看过我之前的系列文章应该多少知道点我写这些文章包括创建 有来商城youlai-mall 这个项目的目的,想给那些真的想提升自己或者迷茫的人(包括自己- ...

  3. mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破

    这一节课,沈老师带我们了解事务的异常 什么是异常? 我们先插入一组数据: ,10.5); 这个是正常的.但是我们把插入的user_money的值故意弄错:如下 ,‘abc’); 那么我们会得到一个ER ...

  4. Django高级实战 开发企业级问答网站 ✌✌

    Django高级实战 开发企业级问答网站 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 从实际需求分析开始,实现当今主流知识问答应用的功能,包括动态.文章.问 ...

  5. 第二十章 Django数据库实战

    第二十章 Django数据库实战 第一课 获取单表单数据的三种方式: urls.py中的路由代码: path('busniess',views.busniess), views.py中代码: def ...

  6. [转] electron实战开发详细流程

    [From] http://www.myk3.com/arc-8856.html 很久没有更新博客,人越来越懒了,唉 说好做的electron教程距离上次玩electron已经过去了好几个月了.. 这 ...

  7. day18 js 正则,UI框架,Django helloworld 以及完整工作流程

    JS正则:    text     判断字符串是否符合规定的正则表达式    exec    获取匹配的数据   默认情况下: 只要能匹配到就返回true 否则返回false 只匹配数字:   所以J ...

  8. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_15-异常处理-异常处理流程

    右侧是框架报的异常 不可预知的,例如数据库连不上这一类的.可以在map中制定某些类的异常,如果找不到就最右边的 99999的, 系统对异常的处理使用统一的异常处理流程: 1.自定义异常类型. 2.自定 ...

  9. Django中的自定义过滤器

    一.为什么要自定义Django中的自定义过滤器:Django中提供了很多内置的过滤器和标签,详见链接django官网,主要有以下几个: autoescape(自动转义)block(模板继承)csrf_ ...

  10. django DRF理解

    django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...

随机推荐

  1. MySQL 的覆盖索引是什么?

    MySQL 的覆盖索引是什么? 覆盖索引(Covering Index)是指索引本身包含了查询所需的所有字段数据,从而无需再回表查询的数据访问方式.这种优化能够显著提升查询性能. 1. 覆盖索引的特点 ...

  2. Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上有什么不同?

    Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上的不同 记忆集(Remembered Set, RSet)是垃圾回收器用来跟踪跨代引用的重要结构,它记录老年代对象对新生代对象的引用 ...

  3. nndeploy开源推理框架教程来袭,模型推理全流程,轻松上手,一键精通!

    大家好,我们是 nndeploy 开源团队.我们专注于打造一款端到端的模型推理和部署框架 -- nndeploy,旨在为用户提供高效.便捷.灵活且兼容主流框架的模型推理和部署体验. 此次,我们开发了 ...

  4. 89.4K star!这个开源LLM应用开发平台,让你轻松构建AI工作流!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Dify 是一款开源的 LLM 应用开发平台,通过直观的可视化界面整合 AI 工作流.RAG ...

  5. maven setting.xml文件配置

    官网文档:http://maven.apache.org/ref/3.2.5/maven-settings/settings.html 下面是我个人的配置 <?xml version=" ...

  6. k8s之数据存储

    查看k8s支持的存储类 kubectl explain pods.spec.volumes 1.emptydir kubectl explain pods.spec.volumes.emptyDir ...

  7. .NET+AI | eShopSupport 知多少

    eShopSupport 项目深度解析 eShopSupport 项目的整体架构示意图.左侧为离线运行的工具(DataGenerator.DataIngestor.Evaluator)用于数据准备和评 ...

  8. mysql8忘记原始密码如何进入问题

    原文链接 http://codebay.cn/post/9447.html 再不找到今天差点要通宵 Mark起来~ 实测mysqld –skip-grant-tables这样的命令行,在mysql8中 ...

  9. React-Native开发鸿蒙NEXT-本地与沙盒加载bundle

    React-Native开发鸿蒙NEXT-本地与沙盒加载bundle 来晚了来晚了,不是想偷懒,实在是一个图片问题没搞定导致效果出不来,今天刚靠工具查出了原因. RN的加载无非本地加载与沙盒加载两种方 ...

  10. git 切换分支和删除本地分支

    如果手误,创建了一个命名不规范的本地分支,以删除dev分支为例,可通过如下方法删除: 先切换到别的分支: git checkout otherBranch 删除本地分支: git branch -d ...