作为一个网站用户,如果说我访问着访问着,突然在打开某个页面的时候,页面上显示了一堆看不懂的错误信息,不说产生什么情绪吧,但是体验感总是变差了。
我们知道,在开发过程中,会有非常多的异常可能会出现,里面有我们已经考虑到了的,还有一些隐蔽的容易被我们忽略的异常,所以,为了能够使那些潜在的异常不会直接暴露给用户,而影响用户体验,我们就需要做异常统一处理了。
什么叫异常统一处理呢?
定义:简单点说,就是针对我们系统中的异常,给予一定规范的处理结果。(默认的情况,就是将异常堆栈信息直接打印到页面,然而这种是极其丑陋的)
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 在看” 你最好看!
👇👇👇下面的咔片谢谢各位老板啦