中间件
什么是中间件
中间件顾名思义,是介于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方法。