django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據本身的規則在合適的時機執行中間件中相應的方法。web
在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每個元素就是一箇中間件django
中間件中一共有四個方法:框架
process_request(self,request) 發送請求函數
process_view(self, request, callback, callback_args, callback_kwargs) 執行完 request 預處理函數並肯定待執行的 view 以後,但在 view 函數實際執行以前。spa
process_exception(self, request, exception) 收集錯誤信息code
process_response(self, request, response) 必須返回 HttpResponse 對象. 這個 response 對象能夠是傳入函數的那一個原始對象(一般已被修改),也能夠是全新生成的。中間件
中間件之 process_request,process_response對象
process_request(self,request)blog
process_response(self, request, response)繼承
當用戶發起請求的時候會依次通過全部的的中間件,這個時候的請求時process_request,最後到達views的函數中,views函數處理後,在依次穿過中間件,這個時候是process_response,最後返回給請求者
在django中叫中間件,在其餘web框架中,有的叫管道,httphandle
中間件都是django中的,咱們也能夠本身定義一箇中間件,咱們能夠本身寫一個類,可是必須繼承MiddlewareMixin
須要注意的是順序,由於是列表或者元組的順序,註冊時按照你既定順序來配置
因此須要導入:from django.utils.deprecation import MiddlewareMixin
項目文件下建立一個Middle目錄,並在下面建立md.py代碼例子以下:
#from django.utils.deprecation import MiddlewareMixin #建議定義類使用MiddlewareMixin class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response class M1(MiddlewareMixin): def process_request(self,request,*args,**kwargs): print('m1.process_request') print("中間件1請求") def process_response(self, request, response): print('m1.process_response') print("中間件1返回") return response class M2(MiddlewareMixin): def process_request(self,request,*args,**kwargs): print('m2.process_request') print("中間件2請求") def process_response(self, request, response): print('m2.process_response') print("中間件2返回") return response
這樣當頁面發起請求的時候:後臺效果以下
中間件之process_view
process_view(self, request, callback, callback_args, callback_kwargs)
咱們在md.py文件中的的代碼進行更改:
from django.conf import settings from django.shortcuts import redirect,HttpResponse class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response class M1(MiddlewareMixin): def process_request(self,request,*args,**kwargs): print('m1.process_request') print("中間件1請求") def process_response(self, request, response): print('m1.process_response') print("中間件1返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("中間件1view") class M2(MiddlewareMixin): def process_request(self,request,*args,**kwargs): print('m2.process_request') print("中間件2請求") def process_response(self, request, response): print('m2.process_response') print("中間件2返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("中間件2view")
運行以後效果