Django 中間件簡介
Django 中間件簡介
django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中間件中相應的方法。
在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件
中間件中一共有四個方法:
process_request(self,request) 發送請求
process_view(self, request, callback, callback_args, callback_kwargs) 執行完 request 預處理函數並確定待執行的 view 之後,但在 view 函數實際執行之前。
process_exception(self, request, exception) 收集錯誤信息
process_response(self, request, response) 必須返回 HttpResponse 對象. 這個 response 對象可以是傳入函數的那一個原始對象(通常已被修改),也可以是全新生成的。
中間件之 process_request,process_response
process_request(self,request)
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 #建議定義類使用MiddlewareMixinclass 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")
運行之後效果
Django 中間件簡介