Django笔记之全局异常处理

news/2024/12/13 17:20:29/

这一篇笔记介绍 Django 的全局异常处理。

当我们在处理一个 request 请求时,会尽可能的对接口数据的格式,内部调用的函数做一些异常处理,但可能还是会有一些意想不到的漏网之鱼,造成程序的异常导致不能正常运行,甚至会直接报给前端一个错误。

为了避免这种情况的发生,令我们的后端服务看起来是正常的,就算有报错也可以很体面的给前端一个提示,以及后端做一些错误日志的记录,这里我们引入全局异常的处理。

这里我们会用 Django 的中间件和日志的处理来实现,在本系列文章的第二十九篇和第三十篇,可以先熟悉下这两部分功能的使用。

在介绍中间件的章节,我们介绍了 __call__() 和 process_view() 函数,其实还有一个 process_exception() 函数,这个函数就是当我们的请求在发生不可预知的报错的情况下,会自动调用的函数。

我们来看这样一个处理的示例:

# hunter/middlewares/exception_middleware.pyimport traceback
from django.http import JsonResponse
import logginglogger = logging.getLogger(__name__)class ExceptionMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):response = self.get_response(request)return responsedef process_exception(self, request, exception):traceback_info = traceback.format_exc()logger.info(f"request_path: {request.path}, traceback_info: {traceback_info}")return JsonResponse({"code": -1, "msg": "error"}, status=500)

在这里,我们使用 traceback.format_exc() 函数获取到 exception 的报错信息,然后通过 logger 日志打印输出。

日志信息 

这里我们主要输出两个信息,一个是接口请求的路径,request.path,一个是报错信息 traceback_info,当然,这里我们还可以记录更多的信息,比如请求的用户信息,请求的参数等。

记录之后,后端就可以通过日志的具体信息去查看到底是哪里出了问题。

返回报错

在这里,调用 process_exception() 函数之后,我们这里直接 return 了 response,还有一个 http 的状态码 status=500,这些信息都是可以自己拟定的,到时候和前端约定好,检测返回了某个状态码比如 500,然后就友好的显示某个报错弹窗信息,比如后台正在处理报错等。

调用中间件

定义好这个中间件之后,我们就需要在 settings.py 里去引用这个中间件,比如这个中间件我们放置的目录是 hunter/middlewares/exception_middleware.py,就需要在 hunter/settings.py 的 MIDDLEWARE 末尾加上 'hunter.middlewares.exception_middleware.ExceptionMiddleware', 这一条。

# hunter/settings.pyMIDDLEWARE = [...'hunter.middlewares.exception_middleware.ExceptionMiddleware',
]

测试报错

我们去尝试触发报错信息,比如之前在 第二十九篇笔记中写的一个接口,这里我们修改一下,直接报错:

# blog/views.pyfrom django.http import HttpResponse, JsonResponsedef time_view(request):html = "<h1>abc</h1>"1 / 0return HttpResponse(html)

然后在页面或者 postman 里调用该接口,就可以在 logger 指定的日志文件里看到关于这一行的具体报错信息啦。

以上就是本篇笔记的全部内容,接下来我会接着介绍一下 Django 里 session 的一个简单应用,也就是说如何判断用户是否登录的一个示例。


http://www.ppmy.cn/news/1053551.html

相关文章

使用nrm快速切换npm源以及解决Method Not Implemented

文章目录 什么是nrm如何使用nrm查看本机目前使用的npm 源安装nrm查看可选源查看当前使用源切换源添加源删除源测试源的响应时间 如果你遇到这个报错&#xff0c;就可以采用这种方案解决哦解决方案&#xff1a;1. 切换为官方源2. 查看漏洞3. 修复漏洞4. 下面命令慎重使用&#x…

电商平台按关键字搜索商品淘宝京东拼多多api接口PHP示例

关键词搜索商品接口的作用是通过调用接口来实现在电商平台中进行商品搜索。具体而言&#xff0c;该接口可以提供以下功能和作用&#xff1a; 商品搜索&#xff1a;用户可以通过输入关键词&#xff0c;在电商平台上进行商品搜索。接口可以根据关键词对商品的名称、描述、标签等…

Mybatis 建立依赖失败:报错Dependency ‘mysql:mysql-connector-java:8.0.28‘ not found

Mybatis 建立依赖失败&#xff1a;报错Dependency ‘mysql:mysql-connector-java:8.0.28’ not found 解决办法&#xff1a; 写完依赖代码&#xff0c;直接重构&#xff0c;下载依赖。 图片: ![Alt](https://img-home.csdnimg.cn/images/20220524100510.png Mac 版本注意Ide…

10种最流行的3D模型文件格式及转换方法

3D 文件格式用于存储有关 3D 模型的信息。 你可能听说过一些最流行的格式&#xff0c;包括 STL、OBJ、FBX 和 DAE。 它们广泛应用于从视频游戏动画到工业增材制造的各种应用中。 在本文中&#xff0c;我们将考虑为什么有这么多不同的格式&#xff0c;探讨 3D 文件格式存储的四…

PMP串讲

&#xff01;5种冲突解决策略 &#xff01;敏捷3355。 &#xff1f;PMP项目管理132种工具技术合集&#xff1a; 参考2&#xff1a;项目管理的132种工具 - 水之座 ?质量管理,有多少种图&#xff1a; ?风险管理,有多少种图&#xff1a; --参考&#xff1a;PMP相关的十八种…

前端需要理解的HTML知识

HTML&#xff08;超文本标记语言&#xff0c;HyperText Markup Language&#xff09;不是编程语言&#xff0c;而是定义了网页内容的含义和结构的标记语言。。“超文本”&#xff08;hypertext&#xff09;是指连接单个网站内或多个网站间的网页的链接。HTML 使用“标记”&…

Vue使用Animate.css

说一下Animate.css这个动画库&#xff0c;很多的动画在这个库里面都定义好了&#xff0c;我们用的时候可以直接使用里面的类名就可以了&#xff0c;就是直接目标元素绑定对应的类名就可以实现动画效果&#xff0c;非常方便&#xff0c;库其实也相对简单&#xff0c;使用起来也简…

grpc整合Springboot

一、grpc的依赖 <dependencies><dependency><groupId>net.devh</groupId><artifactId>grpc-server-spring-boot-starter</artifactId><version>2.9.0.RELEASE</version></dependency></dependencies><build>…