django如何自己創(chuàng)建一個中間件
中間件是什么?
中間件是類似flask函數(shù)中鉤子函數(shù)的東西??梢栽谡埱笠晥D函數(shù)前,或者視圖函數(shù)響應后處理某些事情。中間件對全部視圖都有效!

中間件一般會有兩個方法,process_request和process_response。分別用來處理請求到達視圖函數(shù)前,到達視圖函數(shù)后的事情。
編寫一個自定義的中間件
我們可以根據(jù)業(yè)務需要自己編寫一個中間件。在編寫中間件前,你需要讀一下django.utils.deprecation.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
| 方法名 | 作用 | 返回值 | 備注 |
|---|---|---|---|
| __init__(self, get_response=None) | 服務器啟動(重啟)時執(zhí)行一次 | 無 | -- |
| process_request(self, request) | 在視圖執(zhí)行之前調(diào)用 |
|
-- |
| process_response(self, request, response) | 在視圖執(zhí)行完之后調(diào)用 | 必須返回HttpResponse對象 | -- |
編寫自定義的中間件:
class My_middleware(MiddlewareMixin):
def __init__(self,get_response=None):
super().__init__(get_response)
def process_request(self,request):
"""
視圖函數(shù)前執(zhí)行的,一旦這里有return將到達不了視圖函數(shù)
request是瀏覽器發(fā)過來的請求
"""
print("視圖函數(shù)執(zhí)行前")
def process_response(self,request,response):
"""
視圖函數(shù)后執(zhí)行的
request是瀏覽器發(fā)過來的請求
response是視圖函數(shù)返回的響應
"""
print("視圖函數(shù)執(zhí)行后")
# 因為你拿了視圖函數(shù)的response,就算處理的業(yè)務與response無關也要返回response
return response
中間件的注冊
MIDDLEWARE = [ ... 'middlewares.My_middleware' # 寫上自己的路徑 ]
多個中間件的執(zhí)行順序

?。。∪绻愣x了多個中間件,記得注意一下中間件擺在setting.py文件的位置:
- 注冊中間件設置是由上到下執(zhí)行的,所以上面的中間件會先被注冊
- 對于視圖函數(shù)執(zhí)行前的process_request,先注冊的中間件會先執(zhí)行
- 對于視圖函數(shù)執(zhí)行后的process_response,后注冊的中間件會先執(zhí)行
例如:
先注冊中間件1,后注冊中間件2。
輸出結果是:
before 視圖(中間件1) before 視圖 2(中間件2) ==index== after 視圖 2(中間件2) after 視圖(中間件1)
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Python常用驗證碼標注和識別(需求分析和實現(xiàn)思路)
通過本文的介紹,我們了解了Python在常用驗證碼標注和識別方面的應用,在實際項目中,我們可以根據(jù)具體需求選擇合適的模型和工具,實現(xiàn)高效、準確的驗證碼標注和識別,感興趣的朋友跟隨小編一起看看吧2024-03-03
在Python中使用SimpleParse模塊進行解析的教程
這篇文章主要介紹了在Python中使用SimpleParse模塊進行解析的教程,文章來自于IBM官方的開發(fā)者技術文檔,需要的朋友可以參考下2015-04-04
python編程使用協(xié)程并發(fā)的優(yōu)缺點
協(xié)程是一種用戶態(tài)的輕量級線程,又稱微線程。這篇文章主要介紹了python編程使用協(xié)程并發(fā)的優(yōu)缺點,感興趣的朋友跟隨小編一起看看吧2018-09-09
python numpy和list查詢其中某個數(shù)的個數(shù)及定位方法
今天小編就為大家分享一篇python numpy和list查詢其中某個數(shù)的個數(shù)及定位方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
如何實現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件
這篇文章主要介紹了如何實現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06
Python通過tkinter實現(xiàn)百度搜索的示例代碼
這篇文章主要介紹了Python通過tkinter實現(xiàn)百度搜索的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04

