1. 程式人生 > >day060 中介軟體及session原始碼

day060 中介軟體及session原始碼

本節內容:

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方法開始返回

1、流程圖如下:

四、session原始碼解析(詳細過程)