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