暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Django怎么利用中间件实现服务统一异常处理?

1538

作为一个网站用户,如果说我访问着访问着,突然在打开某个页面的时候,页面上显示了一堆看不懂的错误信息,不说产生什么情绪吧,但是体验感总是变差了。

我们知道,在开发过程中,会有非常多的异常可能会出现,里面有我们已经考虑到了的,还有一些隐蔽的容易被我们忽略的异常,所以,为了能够使那些潜在的异常不会直接暴露给用户,而影响用户体验,我们就需要做异常统一处理了。

什么叫异常统一处理呢?

定义:简单点说,就是针对我们系统中的异常,给予一定规范的处理结果。(默认的情况,就是将异常堆栈信息直接打印到页面,然而这种是极其丑陋的)

Django中怎么做异常统一处理?

django中可以通过它的中间件机制来实现异常的统一处理。

Django 中间件

中间件是Django请求/响应处理的钩子框架。它是一个轻量级、low-level的“插件”系统,用于全局修改Django的输入或输出。

以上是官方文档的解释。那么怎么理解这句话呢?

一般来说,HTTP Web服务器工作原理都是接收用户发来的请求(request), 然后给出响应(response)。Django也不例外,其一般工作方式是接收request请求和其它参数,交由视图(view)处理,然后给出它的响应(response): 渲染过的html文件或json格式的数据。

然而在实际工作中Django并不是接收到request对象后,马上交给视图函数或类(view)处理,也不是在view执行后立马把response返回给用户。

一个请求在达到视图View处理前需要先经过一层一层的中间件处理,经过View处理后的响应也要经过一层一层的中间件处理才能返回给用户。

django整个处理流程逻辑

图片来源:https://juejin.cn/post/7011901157429739551#heading-10

Django的中间件执行顺序

当我们在settings.py注册中间件时需要考虑中间件的执行顺序,中间件在request到达view之前是从上向下执行的,在view执行完后返回response过程中是从下向上执行的,如下图所示。

图片来源:https://pythondjango.cn/django/advanced/9-middleware/

自定义中间件

自定义中间件,定义为函数,也可以为类。中间件还有几个钩子函数。

钩子函数被调用时机
process_request(self,request)在视图函数之前执行。
process_view(self, request, view_func, view_args, view_kwargs)视图函数之前,process_request方法之后执行
process_exception视图函数中出现异常了才执行
process_response(self, request, response)视图函数之后执行

中间件有哪些作用?

中间件常用于权限校验、限制用户请求、打印日志、改变输出内容等多种应用场景,比如:

  • 禁止特定IP地址的用户或未登录的用户访问我们的View视图函数
  • 对同一IP地址单位时间内发送的请求数量做出限制
  • 在View视图函数执行前传递额外的变量或参数
  • 在View视图函数执行前或执行后把特定信息打印到log日志
  • 在View视图函数执行后对response数据进行修改后返回给用户

具体怎么做异常统一处理?

在 Django 项目中可以自定义中间件类 继承 django.middleware.common 下的 MiddlewareMixin 中间件类(这个类废弃了,但是新版本仍是兼容的,而且我用习惯了,懒的用新的了.....),重写 process_exception 方法的异常处理逻辑,然后在项目配置下的中间件中注册即可进行全局异常处理。

比如我下面的例子中,在视图异常时,日志中打印错误的堆栈信息。

# -*- coding: UTF-8 -*-
import logging
import traceback
from django.utils.deprecation import MiddlewareMixin
logger = logging.getLogger('default')


class ExceptionLoggingMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        logger.error("接口调用失败:$s", request.path)
        logger.error(traceback.format_exc())


复制

setting的MiddleWares中添加自定义的MiddleWare

当然更加好的一种做法是,结合自定义的异常和状态码枚举类,来统一和规范异常返回信息。可参考:https://juejin.cn/post/7011901157429739551#heading-10。

参考:
https://pythondjango.cn/django/advanced/9-middleware/
https://juejin.cn/post/7011901157429739551#heading-10
https://www.chenshaowen.com/blog/error-code-design-and-unified-processing-in-django.html


点个“赞 or 在看” 你最好看!


关注我,和我一起拯救吧!



👇👇👇下面的咔片谢谢各位老板啦

文章转载自PostgreSQL运维技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论