day062 中间件

中间件: 

  作用: 介于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 MiddlewareMixin

class 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 MiddlewareMixin

class 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 MiddlewareMixin

class 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对象,会报错

  

原文地址:https://www.cnblogs.com/zty1304368100/p/10496702.html