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是响应回来的内容