中间件:
作用: 介于request和response之间的一到处理过程,相对比较轻量级,并且在全局上改变django的输入与输出,因为改变的是全局,所以需要谨慎使用,用不好会影响到性能.
当用户发送请求的时候会依次经过所有的中间件,这是红请求时process_request,最后到达views函数中,views函数处理后,会依次穿过中间件,这个时候是process_response,最后返回给请求者.
中间件的位置在settings配置,MIDDLEWARE中, 按照从上往下的顺序执行:
自定义中间件:
上图的中间件是django自带的中间件,我们也可以自定义中间件,即写一个类,但是这个类必须继承MiddlewareMixin.
此时还要在settings中的MIDDLEWARE中,最下面加上你自定义的中间件:
''middlewares.MD1'' ,
''middlewares.MD2'' , 这里的MD1和MD2是你写的类名
自定义中间件实例
目录: 在项目中创建一个包(文件夹),随便起名字,一般我们都起名叫utils包里面,表示一个公共组件,创建一个py文件,随便起名,例如我们起名叫middlewares.py .
from django.utils.deprecation import MiddlewareMixinclass mdware(MiddlewareMixin): #自定义中间件,不是必须要有下面这两个方法,有request方法说明请求来了要处理,有response方法说明响应出去需要处理,不是非要写这两个方法,如果没写process_response,那么会一层一层 的往上找,那个中间件有process_response方法就返回对象给哪个中间件 def process_request(self,request): print('md1中的 process_request') def process_response(self,request,response): print('md2中的 process_response') return response #此时必须要return response, 这里类比于跑接力的接力棒
process_request
process_request有一个参数,就是request,这个request和视图函数中的request是一样的,如果没有返回值,就按照正常流程走,如果返回了一个Httpresponse,django将不会执行视图函数,而将对应的Httpresponse对象返回给浏览器.
from django.utils.deprecation import MiddlewareMixinclass md1(MiddlewareMixin): def process_request(self,request): print(" md1中的process_request") class md2(MiddlewareMixin): def process_request(self,request): print("md2中的process_request ")
process_response
process_response有两个参数,一个是request,另一个是response , request和之前是一样的,response是视图函数返回的Httpresponse对象,该方法的返回值也必须是Httpresponse对象.
from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin): def process_request(self,request): print('MD1中的process_request') def process_response(self,request,response): #request和response两个参数必须有 print('MD1中的process_response') return Httpresponse('ojbk')class MD2(MiddlewareMixin): def process_request(self,request): print('MD2中的process_request') def process_response(self,request,response): print('MD1中的process_response') return response #必须返回response,不然上层中间件没有拿到HTTPresponse对象,会报错