柚子快報邀請碼778899分享:Django-中間件
柚子快報邀請碼778899分享:Django-中間件
什么是中間件?
????????官方的說法:中間件是一個用來處理Django的請求和響應(yīng)的框架級別的鉤子。它是一個輕量、低級別 的插件系統(tǒng),用于在全局范圍內(nèi)改變Django的輸入和輸出。每個中間件組件都負責做一些特定的功 能。
????????但是由于其影響的是全局,所以需要謹慎使用,使用不當會影響性能。 說的直白一點中間件是幫助我們在視圖函數(shù)執(zhí)行之前和執(zhí)行之后都可以做一些額外的操作,它本質(zhì)上 就是一個自定義類,類中定義了幾個方法,Django框架會在處理請求的特定的時間去執(zhí)行這些方法。 我們一直都在使用中間件,只是沒有注意到而已,打開Django項目的Settings.py文件,看到下圖的 MIDDLEWARE配置項。
Django中的中間件是什么?
????????是一個python類,用來在全局范圍內(nèi)處理請求和響應(yīng)的一個鉤子
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",
"corsheaders.middleware.CorsMiddleware", # 解決同源策略中間件
]
?????????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,則繼續(xù)按照django定義的 規(guī)則向后繼續(xù)執(zhí)行,如果是HttpResponse對象,則直接將該對象返回給用戶。
自定義一個中間件示例
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self,request):
print('這是MD1中的process_request方法')
process_request
????????process_request有一個參數(shù),就是request,這個request和視圖函數(shù)中的request是一樣的。 它的返回值可以是None也可以是HttpResponse對象。返回值是None的話,按正常流程繼續(xù)走,交 給下一個中間件處理,如果是HttpResponse對象,Django將不執(zhí)行視圖函數(shù),而將響應(yīng)對象返回給 瀏覽器。
多個中間件時,Django執(zhí)行process_request方法。
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self, request):
print("MD1里面的 process_request")
class MD2(MiddlewareMixin):
def process_request(self, request):
print("MD2里面的 process_request")
# 在settings.py的MIDDLEWARE配置項中注冊上述兩個自定義中間件:
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',
'middlewares.MD1', # 自定義中間件MD1
'middlewares.MD2' # 自定義中間件MD2
]
此時,我們訪問一個視圖,會發(fā)現(xiàn)終端中打印如下內(nèi)容:
?????????MD1里面的 process_request
?????????MD2里面的 process_requestapp01 中的 index視圖
把MD1和MD2的位置調(diào)換一下,再訪問一個視圖,會發(fā)現(xiàn)終端中打印的內(nèi)容如下:
????????MD2里面的 process_request
????????MD1里面的 process_requestapp01 中的 index視圖
????????看結(jié)果我們知道:視圖函數(shù)還是最后執(zhí)行的,MD2比MD1先執(zhí)行自己的process_request方法。 在打印一下兩個自定義中間件中process_request方法中的request參數(shù),會發(fā)現(xiàn)它們是同一個對象。 由此總結(jié)一下:
????????中間件的process_request方法是在執(zhí)行視圖函數(shù)之前執(zhí)行的。
????????當配置多個中間件時,會按照MIDDLEWARE中的注冊順序,也就是列表的索引值,從前到后依次執(zhí)行的。
????????不同中間件之間傳遞的request都是同一個對象
柚子快報邀請碼778899分享:Django-中間件
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。