首页 > 其他分享 >Django笔记三十一之全局异常处理

Django笔记三十一之全局异常处理

时间:2023-04-26 20:11:09浏览次数:56  
标签:__ exception traceback request 三十一 笔记 Django 报错 response

本文首发于公众号:Hunter后端

原文链接:Django笔记三十一之全局异常处理

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

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

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

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

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

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

# hunter/middlewares/exception_middleware.py

import traceback
from django.http import JsonResponse
import logging

logger = logging.getLogger(__name__)


class ExceptionMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def 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.py

MIDDLEWARE = [
    ...
    'hunter.middlewares.exception_middleware.ExceptionMiddleware',
]

测试报错

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

# blog/views.py

from django.http import HttpResponse, JsonResponse

def time_view(request):
    html = "<h1>abc</h1>"
    1 / 0
    return HttpResponse(html)

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

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

如果想获取更多后端相关文章,可扫码关注阅读:

image

标签:__,exception,traceback,request,三十一,笔记,Django,报错,response
From: https://www.cnblogs.com/hunterxiong/p/17357139.html

相关文章

  • Linux笔记
    Linux注:笔记中带有特殊标识,特殊标识仅为作者自己设立,起提醒作用枫染:主要是标识额外的其他命令,或补充命令幻舞:主要是标识命令的其他用法,多用法,或选项寒星:主要是标识快捷方式和键盘操作落霞:主要是标识其他操作或危险命令操作Linux用户Linux的用户有三种:root 普通用户 系统......
  • 【学习笔记】拓展中国剩余定理
    若干方程组:\(\begin{cases}x\equivc_1\quad(\modp_1)\\x\equivc_2\quad(\modp_2)\\···\\x\equivc_m\quad(\modp_m)\end{cases}\)求x但不保证p互质。采用两两方程合并的形式。\(\begin{cases}x\equivc_1\quad(\modp_1)\\x\equivc_2\quad(\modp_2)\......
  • Django模板层 (变量分配 过滤器 标签 继承和导入 自定义过滤器、标签及inclusion_ta
    目录一、模板变量分配定义 在后端变量的值通过模板语法传到前端符号{{}}:主要与数据值相关{%%}:主要与逻辑相关模板语法注意点:1.针对需要加括号调用的名字django模板语法会自动加括号调用你只需要写名字就行2.模板语法的注释{##},前端浏览器是无法查看的,因为它要先......
  • django token 认证 简单记录
    classUser(AbstractUser):username=models.CharField(max_length=20,unique=True,primary_key=True,verbose_name="用户名")email=models.EmailField(max_length=256,null=False,verbose_name="邮箱",blank=True)pass......
  • Webserver学习笔记
    前言Webserver这个东西真的恶心的一批,很难自学,但是网上又没有现成的教程(谁没事写一个Webserver啊)。这篇文章主要提供Webserver的基本框架的思路,毕竟网站基本框架相同无疑于抄袭,SSD可以先走了。正文准备本篇博客的Webserver基于SOCKET实现,这样只是为了追求底层,相对......
  • Django 查询数据库不释放内存的情况
    查询结果未及时清空如果查询结果较大,可能会占用很多内存。在使用完查询结果后,应该及时清空,以释放占用的内存。可以通过将查询结果赋值给一个变量,然后使用del关键字删除变量来清空查询结果。例如:result=MyModel.objects.all()#使用查询结果...#清空查询结果delresul......
  • mysql主从,django使用多数据库做读写分离
    mysql主从mysql主从搭建的目的1.读写分离2.单个实例并发量低,提高并发量3.只在主库写,读数据都去从库mysql主从原理步骤一:主库db的更新事件(update,insert,delete)被写道binlog步骤二:从库发起连接,连接到主库步骤三:此时主库创建一个binlogdumpthread线程,把binlog的内容发送到......
  • Django进阶:事务操作、悲观锁和乐观锁
    Django进阶:事务操作、悲观锁和乐观锁参考网址https://zhuanlan.zhihu.com/p/372957129事务处理(transaction)对于Web应用开发至关重要,它可以维护数据库的完整性,使整个系统更加安全。比如用户A通过网络转账给用户B,数据库里A账户中的钱已经扣掉,而B账户在接收过程中服务器......
  • CKA学习笔记
    容器容器和虚拟机的区别,容器本身是一个APP,虚拟机是一个完整的系统。容器管理runtime,运行时。高级别Runtime低级别Runtimedockerrunccontainerdlxccri-ogvisorrktkatapodman......一般而言,高级别的Runtime会去调用低级别的Runtime,docker和c......
  • 【学习笔记】杜教筛
    如果我们要求一个积性函数\(f(x)\)的前缀和,可以用杜教筛在\(O(n^{\frac{2}{3}})\)的复杂度求出。具体地,构造函数\(g(x)\)和函数\(h(x)\),使得$h=f*g$,要求的式子是\(S(n)=\sum\limits_{i=1}^{n}f(i)\)。开始推式子。\[\sum\limits_{i=1}^{n}h(i)=\sum\limits_{i=1}^{......