Django Rest Framework 全局异常处理

在这里插入图片描述

在Django Rest Framework(DRF)中,全局异常处理是一种重要的机制,它可以帮助我们更好地管理API中的异常情况,并返回统一的错误响应。本文将详细介绍两种全局异常处理的方法:使用中间件(Middleware)和使用DRF内置的异常处理机制(ExceptionHandler)。

1. 使用中间件进行异常处理

中间件是Django中的一个通用概念,它可以用于全局性的请求和响应处理。我们可以通过自定义中间件来捕获API请求中的异常,并返回统一的错误响应。

步骤1:配置中间件

首先,在项目的settings.py文件中添加我们自定义的异常处理中间件。

# settings.py
MIDDLEWARE = [# ...# 异常处理中间件'utils.middleware.ExceptionMiddleware',
]

步骤2:自定义中间件

然后,在utils/middleware.py文件中定义我们的异常处理中间件。

# utils/middleware.py
import logging
from django.db import DatabaseError
from django.http.response import JsonResponse
from django.http import HttpResponseServerError
from django.middleware.common import MiddlewareMixin
from rest_framework import status
from rest_framework.response import Response
from utils.enums import *
from utils.exceptions import *
from utils.result import R
logger = logging.getLogger('django')
class ExceptionMiddleware(MiddlewareMixin):"""统一异常处理中间件"""def process_exception(self, request, exception):"""统一异常处理:param request: 请求对象:param exception: 异常对象:return:"""if isinstance(exception, BusinessException):# 业务异常处理data = R.set_result(exception.enum_cls).data()return JsonResponse(data)elif isinstance(exception, DatabaseError):# 数据库异常r = R.set_result(StatusCodeEnum.DB_ERR)logger.error(r.data(), exc_info=True)return HttpResponseServerError(StatusCodeEnum.SERVER_ERR.errmsg)elif isinstance(exception, Exception):# 服务器异常处理r = R.server_error()logger.error(r.data(), exc_info=True)return HttpResponseServerError(r.errmsg)return None

步骤3:自定义异常类和状态码枚举

utils/exceptions.pyutils/enums.py文件中,我们可以定义自己的异常类和状态码枚举类。

# utils/exceptions.py
class CommonException(Exception):"""公共异常类"""def __init__(self, enum_cls):self.code = enum_cls.codeself.errmsg = enum_cls.errmsgself.enum_cls = enum_cls  # 状态码枚举类super().__init__()
class BusinessException(CommonException):"""业务异常类"""pass
class APIException(CommonException):"""接口异常类"""pass
# utils/enums.py
class StatusCodeEnum(Enum):"""状态码枚举类"""OK = (0, '成功')ERROR = (-1, '错误')SERVER_ERR = (500, '服务器异常')# ... 其他状态码

步骤4:响应信息封装

utils/result.py文件中,我们可以定义一个统一项目信息返回结果类。

# utils/result.py
class R(object):"""统一项目信息返回结果类"""def __init__(self):self.code = Noneself.errmsg = Noneself._data = dict()@staticmethoddef ok():"""组织成功响应信息:return:"""r = R()r.code = StatusCodeEnum.OK.coder.errmsg = StatusCodeEnum.OK.errmsgreturn r@staticmethoddef error():"""组织错误响应信息:return:"""r = R()r.code = StatusCodeEnum.ERROR.coder.errmsg = StatusCodeEnum.ERROR.errmsgreturn r@staticmethoddef server_error():"""组织服务器错误信息:return:"""r = R()r.code = StatusCodeEnum.SERVER_ERR.coder.errmsg = StatusCodeEnum.SERVER_ERR.errmsgreturn r@staticmethoddef set_result(enum):"""组织对应枚举类的响应信息:param enum: 状态枚举类:return:"""r = R()r.code = enum.coder.errmsg = enum.errmsgreturn rdef data(self, key=None, obj=None):"""统一后端返回的数据"""if key:self._data[key] = objcontext = {'code': self.code,'errmsg': self.errmsg,'data':self._data}return context

步骤5:测试视图

最后,在视图中抛出我们自定义的异常,以测试我们的异常处理机制是否有效。

# views.py
from rest_framework.decorators import api_view
from rest_framework.views import APIView
from utils.enums import StatusCodeEnum
from utils.exceptions import *
class TestView(APIView):@api_view(['POST'])def verify_params(request):"""校验注册信息:param request: 注册请求对象:return: response_ret"""# 接受参数params = get_parameter_dic(request)username = params.get('username')mobile = params.get('mobile')# 校验参数all_args = [username, mobile]if not all(all_args):raise BusinessException(StatusCodeEnum.PARAM_ERR)# 用户名 5-20个字符if not re.match(r'^[a-zA-Z0-9_]{5,20}', username):raise BusinessException(StatusCodeEnum.USER_ERR)# 手机号合法性if not mobile:raise BusinessException(StatusCodeEnum.MOBILE_ERR)return Response("成功", status=status.HTTP_200_OK)

2. 使用ExceptionHandler进行异常处理

除了使用中间件,我们还可以使用DRF内置的异常处理机制(ExceptionHandler)来处理API中的异常。

步骤1:自定义异常处理函数

首先,在utils/exceptions.py文件中定义我们的自定义异常处理函数。

# utils/exceptions.py
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):response = exception_handler(exc, context)if response is not None:response.data['status_code'] = response.status_codeelif isinstance(exc, Exception):response = Response("其它异常")return response

步骤2:配置ExceptionHandler

然后,在项目的settings.py文件中配置我们自定义的异常处理函数。

# settings.py
REST_FRAMEWORK = {# 统一异常处理'EXCEPTION_HANDLER': 'utils.exception.custom_exception_handler'
}

这样,当API中发生异常时,就会调用我们自定义的异常处理函数,并返回统一的错误响应。
以上就是在Django Rest Framework中进行全局异常处理的两种方法。我们可以根据项目的具体需求选择合适的方法来实现异常处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习(3)

目录 3-1线性回归 3-2最小二乘解 3-3多元线性回归 3-4广义线性模型 3-5对率回归 3-6对率回归求解 3-7线性判别分析 3-8LDA的多类推广 3-9多分类学习基本思路 3-10类别不平衡 3-1线性回归 线性模型为什么重要? 人类在考虑问题时,通常…

先有JVM还是先有垃圾回收器?很多人弄混淆了

是先有垃圾回收器再有JVM呢,还是先有JVM再有垃圾回收器呢?或者是先有垃圾回收再有JVM呢?历史上还真是垃圾回收更早面世,垃圾回收最早起源于1960年诞生的LISP语言,Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析…

抖店商品详情API接口(产品参数|详情图)

抖店商品详情API接口(产品参数|详情图) 参数仅供参考: {"code": 0,"msg": "调用成功","time": "1715763239","data": {"properties": [{"format": [{"message": [{&q…

C语言简要(一)

总得让她开心吧 helloworld #include <stdio.h>int main() {printf("hello world!\n");return 0; } 程序框架 #include <stdio.h> int main {return 0; }输出 printf("hello world!\n"); "里面的内容叫做“字符串”&#xff0c;prin…

BUUCTF靶场[MISC]wireshark、被嗅探的流量、神秘龙卷风、另一个世界

[misc]wireshark 考点&#xff1a;流量、追踪流 工具&#xff1a;wireshark 先看题目&#xff0c;管理员密码 将下载的文件用wireshark打开&#xff0c;查找flag 点击追踪tcp流&#xff0c;开始挨个查看flag [misc]被嗅探的流量 考点&#xff1a;流量、追踪流 工具&#xf…

武汉星起航:亚马逊构建综合性商业生态,卖家买家共享全球化红利

在当今全球化日益加速的时代&#xff0c;亚马逊不仅以其卓越的电商平台服务全球消费者&#xff0c;更通过一系列前沿服务打造了一个综合性的商业生态系统。在这个生态系统中&#xff0c;卖家能够轻松拓展全球业务&#xff0c;买家则享受到了前所未有的购物体验。亚马逊以其独特…

FreeRTOS【6】线程优先级

1.开发背景 基于上一篇指引&#xff0c;已经了解了线程的阻塞&#xff0c;这个篇章主要介绍线程优先级的影响 2.开发需求 设计实验验证高优先级会抢占低优先级线程 CPU 3.开发环境 window10 MDK STM32F429 FreeRTOS10.3.1 4.实现步骤 1&#xff09;创建测试线程&#xff…

测试之路 - 精准而优雅

引子 这几年业内一直在做精准测试&#xff0c;大都使用工具 diff 代码改动、分析代码覆盖率这些平台集成的能力。 业务测试中&#xff0c;我们在技术设计和代码实现的基础上也做了一些精减和精准的测试实践&#xff0c;通过深入测试有针对的设计 case&#xff0c;发现隐藏问题…

抖音小程序使用Vant

安装 Vant 有针对小程序的版本&#xff0c;通过npm安装&#xff1a; npm i vant/weapp -S --production构建 npm 安装 Vant Weapp 后需要构建 NPM&#xff0c;在菜单的【工具】选项中选择【构建 NPM】&#xff1a; 使用组件 抖音小程序和微信小程序还是有一些差别的&#x…

怎么把3d模型导出cad立面---模大狮模型网

在设计工作中&#xff0c;将3D模型导出到CAD软件并生成立面图是一项常见但关键的任务。这不仅有助于更好地展示设计方案&#xff0c;还能方便后续的工程制图和施工。本文将介绍如何通过3ds Max软件将3D模型导出到CAD软件&#xff0c;并生成高质量的立面图&#xff0c;为您提供实…

现货正泰漏电小型断路器NXB-32LE-C16 30MA1P+N原装正品NXB-40L

品牌&#xff1a;CHNT/正泰 型号&#xff1a;NXBLE 额定电流&#xff1a;25A,16A,20A,40A,32A 漏电保护器类型&#xff1a;2P 产地&#xff1a;中国大陆 电压&#xff1a;1000V及以下 极数&#xff1a;3P,4p,2P,1PN 电源方式&#xff1a;交流电 3C证书编号&#xff1a;…

大模型时代下的先行者:景联文科技引领数据标注新时代

在大模型时代&#xff0c;数据标注不再是简单的分类标注&#xff0c;而是一项融合了技术革新、专业技能、法律合规和精细化管理的综合性任务&#xff0c;对推动AI技术的发展和落地应用具有重要意义。 景联文科技作为AI基础行业的数据供应商&#xff0c;可协助人工智能企业解决整…

easyx快速入门1

1.基本说明 EasyX 是针对 C 的图形库&#xff0c;可以帮助 C/C 初学者快速上手图形和游戏编程。 比如&#xff0c;可以基于 EasyX 图形库很快的用几何图形画一个房子&#xff0c;或者一辆移动的小车&#xff0c;可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏&#xff0c;可以练…

fl studio试用版文件保存无法打开??一个方法教你免费打开!

前言 当下&#xff0c;各款编曲软件五花八门&#xff0c;而这其中最有声誉的必为FL Studio莫属 这个软件呢国人习惯叫他水果&#xff0c;拥有强大的录音、编曲、混音等功能&#xff0c;所以广受音乐圈欢迎。如今&#xff0c;大部分水果一旦有编曲所需&#xff0c;一般都要使用…

CSS 根据子元素选择父元素,并设置父元素的样式

场景举例&#xff1a;当子元素有增加了一个class时&#xff0c;需要影响其父元素的样式 可以使用":has"伪类来实现选择父元素的效果 <style>.parent:has(.child){background-color: #eee;}p{width:100px;border:1px solid #000;} </style> <body>…

人机协同中的比较、调整与反转

人机协同是指人与机器之间的合作关系&#xff0c;通过共同努力实现特定任务的目标。在人机协同中&#xff0c;存在着比较与调整的过程&#xff0c;这是为了实现更好的合作效果和任务完成质量。 比较是指人与机器在任务执行过程中对彼此的表现进行评估和比较。这可以通过对机器的…

vue+ts+vite+pinia+less+echarts 前端可视化 实战项目

1.初始化前端 输入 npm init vuelatest 命令 然后 选择需要的插件2.构建完成后 在终端切换到vue-project文件夹下 npm install 下载依赖 3.下载 less样式 npm install less less-loader -D 4.下载axios npm install axios 5.下载echarts npm install echarts -S 6.引入中国…

战网国际服加速器用哪个好 暴雪战网好用加速器介绍

战网国际版&#xff0c;又称Battle.net环球版&#xff0c;是暴雪娱乐操盘的全球性游戏互动平台&#xff0c;它跨越地理界限&#xff0c;服务于全球游戏爱好者。与地区限定版本相异&#xff0c;国际版赋予玩家自由进入暴雪旗下众多经典游戏的权利&#xff0c;无论身处何方&#…

对比测评3款BI分析工具

前不久&#xff0c;一位准备入职阿里的学弟问我&#xff0c;他要做电商数据分析&#xff0c;电商有庞杂的标签、模型、数据和业务逻辑&#xff0c;菜鸟应该要具备什么样的分析能力啊&#xff1f; 我看了他的岗位职责&#xff0c;主要是负责经营决策支持、专题分析和数据看板搭…

leetcode-字符串变形-104

题目要求 思路 1.首先根据ASCII的规则&#xff0c;把字符串大小写替换&#xff0c;空格保持不变 2.将整个字符串进行翻转 3.以空格为区间&#xff0c;将区间内的字符串进行翻转&#xff0c;其中翻转的函数reverse() 代码实现 class Solution { public:string trans(string s…