day060 中介軟體及session原始碼
阿新 • • 發佈:2019-01-10
本節內容:
1、中介軟體的概念
2、自定義中介軟體
3、中介軟體的方法存在返回值的執行結果(結合整個流程圖來對比看)
4、session原始碼解析(詳細過程)
一、中介軟體的概念
1、是介於request與response處理之間的一道處理過程,相對比較輕量級。 2、正常情況下,所有進入Django專案的request請求都要逐一經過每一箇中間件, 出去的response也要逐一經過每一箇中間件。 3、由上面可以得出,中介軟體是在全域性上改變Django的輸入和輸出。 因為是改變全域性,所以要謹慎使用,用的不好會影響效能。 對比使用,例如:登入的示例 個人首頁要登入後才能檢視,這時是使用裝飾器好,還是中介軟體限制遊客? 看比例,如果你的檢視函式都是要登入後,才能執行的,這是當然選擇中介軟體。 反之則是,選擇裝飾器,用語法糖。
1、Django預設的Middeware
每一箇中間件都具有具體的功能。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
Python
Copy
2、Django專案的整個請求與響應流程圖(詳解)重點
二、自定義中介軟體
當用戶發起請求的時候會依次經過所有的的中介軟體,這個時候的請求時process_request,
最後到達views的函式中,views函式處理後,在依次穿過中介軟體,
這個時候是process_response,最後返回給請求者。
1、首先介紹中介軟體中僅有的四個方法:
process_request
1、所有的請求進來都要執行的函式,預設返回值為None,不寫return
2、 寫了return,不在執行其他,立即執行response,從當前的中介軟體開始,逐個返回 process_view 1、若有,執行所有request函式後,先逐個執行這個方法,按進來request的中介軟體順序 2、若其中一個,有返回值,不在執行檢視函式,直接從最後一個response方法開始逐個返回, process_exception 1、捕獲異常的,若有返回值,則直接從最後的response開始逐個返回 process_response 1、接力返回,該方法必須要有返回值,不然會出錯
Python
Copy
2、我們自定義中介軟體
上述截圖中的中介軟體都是django中的,我們也可以自己定義一箇中間件,
我們可以自己寫一個類,但是必須繼承MiddlewareMixin
寫在那裡無所謂,在settings新增好字串路徑就行
# 檢視函式中的程式碼,views.py
def index(request): print("index...") return HttpResponse("OK")
Python
Copy
自定義的中介軟體middleware.py檔案
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse class M1(MiddlewareMixin): def process_request(self,request): print("M1 process_request... ") # 正常情況 # 返回None即走下一個中介軟體,這裡正常走不會有返回值 # 寫了返回值的情況 # return HttpResponse("禁止訪問!") # 如果這裡直接return,不在執行其他,立即執行process_response,馬上返回響應 def process_response(self,request,response): print("M1 response....") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("Md1 view") # 正常情況,執行完所有中介軟體的view,就執行檢視函式的,然後返回 #return HttpResponse("123") # obj=callback(callback_args) # index(request) # # return obj # 若有返回值,執行完這裡,不再執行其他,直接從最後一個response逐層返回 def process_exception(self, request, exception): # print("md1 process_exception...") return HttpResponse("error") # 若這裡有return,則不再執行其他exception函式,開始逐層返回response class M2(MiddlewareMixin): def process_request(self,request): print("M2 process_request... ") def process_response(self, request, response): print("M2 response....") return response # response是逐層傳遞的,必須寫return, # 可以不寫這個函式,寫了必須有返回值 def process_view(self, request, callback, callback_args, callback_kwargs): print("Md2 view") def process_exception(self, request, exception): print("m2 exception",exception) print("md2 process_exception...") #return HttpResponse(exception)
Python
Copy
三、中介軟體的方法存在返回值的執行結果(結合整個流程圖來對比看)
1、在request方法中有返回值
如果當請求到達請求2的時候直接不符合條件返回,
即return HttpResponse("Md2中斷"),不再執行其他,
程式直接把請求直接發給中介軟體2返回,然後依次返回到請求者,
1、流程圖如下:
2、在process_view方法中有返回值
首先我們要知道process執行的位置,是在所有的request之後,所有的檢視函式之前
如果在某一個process_view函式中有返回值,不再執行其他
立即從最後一個response方法開始返回
1、流程圖如下:
3、在process_exception中有返回值
首先這裡的接收到的錯誤,是檢視函式傳遞過來的,
若其中一個process_exception方法中有返回值,不再執行其他,
立即從最後一個response方法開始返回