中间件

什么是中间件

  中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

中间件实现的功能

  1.用户认证

  2.日志记录

  3.跨站请求(csrf_token,对所有的post请求都做了验证)

  4.Session

  5.权限管理

中间件的组成部分

   process_request

      当客户端发起Request请求,首先经过每个中间件的process_request方法,通过路由系统,最后才访问视图。

   process_response

      视图函访问之后,此时执行Response过程,依次通过每个中间件的process_response方法,最后把结果返回给客户端。

    

    从上面的图示可以看出,在Request请求的时候,依次执行的是每个中间件的process_request方法,当访问完视图函数之后,首先执行最后一个中间件的process_response方法,然后一次执行至第一个中间件的process_response方法,最终返回给浏览器。因此放在前面的中间件会先被执行,放在后面的中间件会靠后执行。

自定义中间件

    创建步骤

      1.导入MiddlewareMixin类。from django.utils.deprecation import MiddlewareMixin

      2.在App中自定义一个文件夹,在该文件夹中创建.py文件。

      3.在项目的Settings.py文件中注册自定义的中间件。格式: App名称.文件夹名称.py文件名.类名

代码示例:

 1 from django.utils.deprecation import MiddlewareMixin
 2 from django.shortcuts import HttpResponse
 3 
 4 
 5 class M1(MiddlewareMixin):
 6     def process_request(self,request):
 7         print("中间件1请求")
 8 
 9     def process_response(self,request,response):
10         print("中间件1返回")
11         return response
12 
13 
14 class M2(MiddlewareMixin):
15     def process_request(self,request):
16         print("中间件2请求")
17         # return HttpResponse("走")
18 
19     def process_response(self,request,response):
20         print("中间件2返回")
21         return response
22 
23 
24 class M3(MiddlewareMixin):
25     def process_request(self,request):
26         print("中间件3请求")
27 
28     def process_response(self,request,response):
29         print("中间件3返回")
30         return response
31 #Settings.py部分
32 MIDDLEWARE = [
33     'django.middleware.security.SecurityMiddleware',
34     'django.contrib.sessions.middleware.SessionMiddleware',
35     'django.middleware.common.CommonMiddleware',
36     'django.middleware.csrf.CsrfViewMiddleware',
37     'django.contrib.auth.middleware.AuthenticationMiddleware',
38     'django.contrib.messages.middleware.MessageMiddleware',
39     'django.middleware.clickjacking.XFrameOptionsMiddleware',
40     'cmdb.middle.m1.M1',
41     'cmdb.middle.m1.M2',
42     'cmdb.middle.m1.M3',
43 ]

执行结果:

    当中间件的process_request出现return时

执行过程:

执行结果:

    结论

      当中间件中的process_request方法有返回值时,此时会将该返回值返回给本中间件的process_response方法,不再执行以后的中间件,至此返回。

    当中间件中含有process_view方法时

代码做如下修改:

 1 from django.utils.deprecation import MiddlewareMixin
 2 from django.shortcuts import HttpResponse
 3 
 4 
 5 class M1(MiddlewareMixin):
 6     def process_request(self,request):
 7         print("中间件1请求")
 8 
 9     def process_response(self,request,response):
10         print("中间件1返回")
11         return response
12 
13     def process_view(self, request, callback, callback_args, callback_kwargs):
14         print("中间件1view")
15 
16 
17 class M2(MiddlewareMixin):
18     def process_request(self,request):
19         print("中间件2请求")
20         # return HttpResponse("")
21 
22     def process_response(self,request,response):
23         print("中间件2返回")
24         return response
25 
26     def process_view(self, request, callback, callback_args, callback_kwargs):
27         print("中间件2view")
28 
29 
30 class M3(MiddlewareMixin):
31     def process_request(self,request):
32         print("中间件3请求")
33 
34     def process_response(self,request,response):
35         print("中间件3返回")
36         return response
37 
38     def process_view(self, request, callback, callback_args, callback_kwargs):
39         print("中间件3view")

执行结果:

执行过程:

    结论

      当执行完所有中间件的Request后,进入路由系统,此时在process_view的参数中保存要访问的视图函数URL,然后依次执行各个中间价的process_view方法,之后执行view视图函数,最后一次通过每个中间件的process_response方法。

原文地址:https://www.cnblogs.com/liuyinzhou/p/8505050.html