梳理Python 框架之中介軟體詳解(用途和機制)
什麼是中介軟體?
中介軟體是一個Python程式設計師用來處理Django的請求和響應的框架級別的鉤子,它是一個輕量,低級別的外掛系統,用於全域性範圍內改變Django的輸入,輸出。每個中介軟體元件都負責做一些特定的功能。
說的直白一點是中介軟體就是幫我們程式設計師在檢視函式執行之前和執行之後都可以一些額外的操作,它是一個自定義的類,類中定義了幾個方法,Django框架會在請求的特定時間去執行這些方法。
在Python專案中一直都在有使用中介軟體,在django專案中的setting.py檔案中看到MIDDLEWARE配置項:
MIDDLEware是一個列表,列表中是一個個字串,這些字串其實是類,也就是中介軟體。
自定義中介軟體的規則
1.要繼承MIDDLEWAREMIXIN類,
2.要重寫父類方法
3.將類新增到setting.py檔案中MIDDLEWARE配置項裡
父類的五個方法(主要process_request process_response)
process_request(self,request)
process_view(self,request,view_func,view_args,view_kwargs)
process_template_response(self,request,response)
process_exception(self,request,exception)
process_response(self,request,response)
返回值可以是一個NONE,或者HttpResponse物件,如果是none,繼續按照django定義的向下執行,如果返回是Httpresponse物件,則直接將該物件返回給使用者。
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self,request):
print("MD1裡面的 process_request")
def process_response(self,request,response):
print(“MD1裡面的process_response”)
return response
中介軟體的五種方法詳解
process_request
process_request有一個引數,就是request ,這個request和檢視函式的request一樣的。
它的返回值可以是none也可以是httpresponse物件,返回none,就按照正常流程走,交給下箇中間件處理,如果是httpresponse物件,django將不執行檢視函式,而將相應物件返回給瀏覽器。
我們看一看多箇中間件是怎麼執行的,django是如何執行process_request方法的。
在setting.py中MIDDLEWARE配置項中註冊上述兩個自定義中介軟體:
此時,我們訪問一個檢視,發現列印如下內容:
如果把MD1和MD2的位置換一下,再次訪問,列印如下內容:
由此總結:
1.中介軟體的process_request方法是在執行檢視函式之前執行的
2.當配置中介軟體時,會按照MIDDLEWARE的註冊順序,也就是列表的索引值,從前到後依次執行的。
3.不同中介軟體之間傳遞的request都是同一個物件。
porcess_response
它有兩個引數,一個是request,一個response,request就是上述例子的物件,response是檢視返回的httpresponse物件。該方法的返回值也必須是httpresponse物件。
看例子:
訪問檢視函式,看一下終端的輸出:
看結果可知process_response是在檢視函式執行之後開始的,並且順序是MD1比MD2先執行(此時setting,py中MD2比MD1先註冊)
多箇中間件中的process_response方法是按照MIDDLEWARE中的註冊順序倒序執行的,
process_view(self,request,view_func,view_args,view_kargs)
該方法有四個引數
request是httprequest物件。
view_func是即將使用的檢視函式,它是實際的函式物件,而不是函式的名稱作為字串。
view_args是將傳遞給檢視位置的引數的列表。
view_kargs是將傳遞給檢視的關鍵字引數的字典。
view_args和view_kargs都不包含第一個檢視引數(request)
django會在呼叫檢視函式之前呼叫process_view方法。
給MD1和MD2新增process_view方法:
process_exception
process_exception(self,request,exception)
該方法有兩個引數:
一個是httpresponse物件
一個是檢視函式產生的exception物件
這個函式只有在檢視函式丟擲異常才可以執行,它返回none或者httpresponse物件,如果是httpresponse物件,django將呼叫模板和中介軟體中的process_reponse方法,並將返回給瀏覽器,否則預設處理異常,如果返回none,則交給下一個中介軟體的process_exception方法來處理執行,它的執行順序也是按照中介軟體註冊順序的倒序執行。
中介軟體的使用場景
1.做IP限制
放在中介軟體類的列表中,阻止某些ip訪問;
2.URL訪問過濾
如果使用者訪問的是logo檢視(放過)
如果訪問其他檢視,需要檢測是否已經有session,已經有了放行,如果沒有返回login,這樣就省的在多個檢視函式上寫裝飾器了!
3.快取
客戶端請求來了,中介軟體去快取看看有沒有資料,有直接返回給使用者,沒有再去邏輯層執行檢視函式。