自定义中间件

Diango组件中间件:(每次有请求都会走一遍中间件)

  中间件顾名思义,是介于request与response处理之间的一道处理过程

  如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。

可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。

  

 

 

process_request:如果直接有返回值就不继续走下面的中间件了,如果不写return或者return None
  会继续向下走

 

class PrintIPMiddleWare(MiddlewareMixin):
    def process_request(self,request):
        print(request.META.get("REMOTE_ADDR"))
        print('M1 process_request')
        # process_requestv  里如果有返回值不会继续向下执行
        return HttpResponse('hahaa')

#
response 是上面响应的'hahaa',process里有返回值所以下面的中间件,和视图函数就就不执行了
     def process_response(self,request,response):
      print('M1 process_response')

      return HttpResponse('被我篡改了') # return response
终端打印:

127.0.0.1
M1 process_request
M1 process_response

 页面打印
被我篡改了

 

process_view:可以提前执行视图函数

process_exception:如果视图那边报错了就走这边

process_response:必须有返回可以篡改返回请求

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,render

# 需求打印当前请求的ip地址
# 必须继承这个类
class PrintIPMiddleWare(MiddlewareMixin):
    def process_request(self,request):
        print(request.META.get("REMOTE_ADDR"))
        print('M1 process_request')
        # process_requestv  里如果有返回值不会继续向下执行
        # return HttpResponse('hahaa')
    def process_response(self,request,response):
        print('M1 process_response')
        # return HttpResponse('被我篡改了')
        return response

class M2(MiddlewareMixin):
    def process_request(self,request):
        print("M2 process_request")
    def process_response(self,request,response):
        print('M2 process_response')
        return response
    # 参数较多
    def process_view(self,request,callback, callback_args, callback_kwargs):
        # callback 对应url映射的视图函数
        print(callback,'M2_process_view')
        # ret=callback(request)
        # return ret


class M3(MiddlewareMixin):
    def process_request(self,request):
        print('M3 process_request')
    def process_response(self,request,response):
        print('M3 process_response')
        return response
    def process_view(self,request,callback, callback_args, callback_kwargs):
        # callback 对应url映射的视图函数
        print(callback,'M3_process_view')
        # ret=callback(request)
        # return ret

结果:

127.0.0.1
M1 process_request
M2 process_request
M3 process_request
<function login at 0x000001F8FBE00620> M2_process_view
<function login at 0x000001F8FBE00620> M3_process_view
views-login
M3 process_response
M2 process_response
M1 process_response

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

不一定必须有request_response,返回的时候进入中间件没有就继续向上找,response是响应回来的内容


 




 




















posted @ 2018-11-01 17:15  2275114213  阅读(296)  评论(0编辑  收藏  举报