Django中间件MiddleWare生命周期详解

一.什么是中间件:

 

Django中的中间件是利用装饰器原理实现的,具体通过两个函数嵌套,或通过改写类中的__call__方法,实现一个装饰器功能。使之过来的Request的请求,先到call方法中进行处理。配置中间件,实现过程干预。
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
 
 Django中间件MiddleWare生命周期详解_第1张图片

二.中间件可以用来干什么。

 
1. 中间件可以访问追踪日志
2. 控制优先级
3. 黑白名单
4. 访问频率限制
5. 获取访问主机信息

 
 
Django中间件MiddleWare生命周期详解_第2张图片
 
 
 

三.中间件的执行流程

 

1.中间件一共有五个切点:

process_request                    process_response,
process_view,                         process_template_response,
process_exception

 
 
Django中间件MiddleWare生命周期详解_第3张图片
 
 

2.在Django中的settings中,配置了中间件的执行列表,中间件本身就是一个类,执行顺序是从上到下遍历列表,中间件是双向的。

 
 
Django中间件MiddleWare生命周期详解_第4张图片
 
 

3.每个中间件都继承了同一个父类MiddlewareMixin,我们来看下MiddlewareMixin的源码。

 
 
Django中间件MiddleWare生命周期详解_第5张图片
 
 

四.自己定义中间件来查看中间件的生命周期。看看五个切点是何时调用执行,生命周期又是怎样的。

 

1.首先写了三个中间件,然后将他们注册到settings的MIDDLEWARE中,定义一个视图函数,跑一下,看一终端执行情况。以下是切点process_request,process_response两个切点的执行情况:
Django中间件MiddleWare生命周期详解_第6张图片
可以看到先走中间件1,中间件2,中间件3,views视图函数,然后中间件3返回,中间件2返回,中间件1返回
 
 

Django中间件MiddleWare生命周期详解_第7张图片
 
 

所以切点process_request和process_response生命周期如下图:(画的比较丑,凑合看,灵魂画手,图醉意不醉~~~~~~~~~~)

Django中间件MiddleWare生命周期详解_第8张图片
 

2.下面来看切点process_views的生命周期,在每个中间件中定义process_view的方法如下:

Django中间件MiddleWare生命周期详解_第9张图片
执行视图函数,在终端查看执行情况:
Django中间件MiddleWare生命周期详解_第10张图片
 

所以process_view的生命周期如下:先走process_request1,process_request2,process_request3,
process_request3走完之后返回来中间件1,走中间件1的process_view,然后走中间件2的process_view,走中间件3的process_view,然后走视图函数:

 

Django中间件MiddleWare生命周期详解_第11张图片
 

3.第4个切点process_exception,在第三个中间件定义一个捕获异常的中间件:
 

Django中间件MiddleWare生命周期详解_第12张图片
 

首先正常执行是不会走process_exception这个视图函数的,然后我们在视图函数中抛出一个异常,然后执行,查看终端下的执行情况如下:发现它会捕获这个异常并进执行其中方法。
 

Django中间件MiddleWare生命周期详解_第13张图片
 

发现它会捕获这个异常并进执行其中方法。所以process_exception的生命周期如下:
首先前面都正常走,当视图函数中有异常,会被process_exception捕获,从最后一个中间件如果不对这个异常进行处理,会一直往前面抛,如果有中间件处理了,就回到process_response3,往前执行。

 

Django中间件MiddleWare生命周期详解_第14张图片
4.最后一个切点Process_template_response:如果视图函数中有render这个函数的话,就会执行这个切点。以上就是中间件的5个切点详细讲解。

不要忘记点个赞哦!!!

你可能感兴趣的:(Django中间件MiddleWare生命周期详解)