当前位置: 首页 > news >正文

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

文章目录

    • 一、DRF 异常处理流程
      • DRF 默认异常处理流程
      • 源码
    • 二、实战
      • DRF 自定义异常处理流程
      • 应用自定义异常处理流程


一、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_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 自定义异常处理流程示例:

  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从入门到实战》专栏!关注不迷路~

http://www.lryc.cn/news/584242.html

相关文章:

  • QT数据交互全解析:JSON处理与HTTP通信
  • 原生微信小程序研发,如何对图片进行统一管理?
  • 记录今天学习Comfyui的感受
  • JDK 1.7 vs JDK 1.8
  • QT5使用cmakelists引入Qt5Xlsx库并使用
  • 公网 IP 不稳定?用多点 Ping 策略监控真实可达率
  • MyBatis集成Logback日志全攻略
  • Java---IDEA
  • 开源 Canvas 和 WebGL 图形库推荐与对比
  • Yolov模型参数对比
  • 基于大模型的膀胱癌全周期精准诊疗方案研究
  • python自动化面试问题——关于python
  • Using Spring for Apache Pulsar:Transactions
  • Alibaba Druid主要配置
  • WiFi技术深度研究报告:从基础原理到组网应用与未来演进
  • 快速上手MongoDB与.NET/C#整合
  • 跨网文件交换?内外网文件交换十大方法构建安全合规的数据传输通道
  • XSS(跨站脚本攻击)
  • 3.9 spring的mybatis数据库数据回弹以及下划线,驼峰转换
  • 【音视频】TS协议解析
  • 在vscode中和obsidian中使用Mermaid
  • SSRF(ctfshow)
  • 生成式人工智能实战 | 自注意力生成对抗网络(Self-Attention Generative Adversarial Network, SAGAN)
  • Java并发编程中的StampedLock详解:原理、实践与性能优化
  • UI前端大数据可视化实战策略:如何设计交互式数据探索界面?
  • Spring AI Alibaba(2)——通过Graph实现工作流
  • 异步I/O库:libuv、libev、libevent与libeio
  • Ubuntu基础(Python虚拟环境和Vue)
  • 输入框过滤选项列表,el-checkbox-group单选
  • 案例分享--福建洋柄水库大桥智慧桥梁安全监测(二)之数字孪生和系统平台