Django中的中間件是一個(gè)輕量級(jí)瀑罗、底層的插件系統(tǒng)胸嘴,可以介入Django的請(qǐng)求和響應(yīng)處理過程,修改Django的輸入或輸出斩祭。中間件的設(shè)計(jì)為開發(fā)者提供了一種無侵入式的開發(fā)方式劣像,增強(qiáng)了Django框架的健壯性,其它的MVC框架也有這個(gè)功能停忿,名稱為IoC驾讲。
Django在中間件中預(yù)置了五個(gè)方法,這五個(gè)方法的區(qū)別在于不同的階段執(zhí)行席赂,對(duì)輸入或輸出進(jìn)行干預(yù)吮铭,方法如下:
1)初始化:無需任何參數(shù),服務(wù)器響應(yīng)第一個(gè)請(qǐng)求的時(shí)候調(diào)用一次颅停,用于確定是否啟用當(dāng)前中間件谓晌。
def __init__(self):
pass
2)處理請(qǐng)求前:在每個(gè)請(qǐng)求上,request對(duì)象產(chǎn)生之后癞揉,url匹配之前調(diào)用纸肉,返回None或HttpResponse對(duì)象溺欧。
def process_request(self, request):
pass
3)處理視圖前:在每個(gè)請(qǐng)求上,url匹配之后柏肪,視圖函數(shù)調(diào)用之前調(diào)用姐刁,返回None或HttpResponse對(duì)象。
def process_view(self, request, view_func, *view_args, **view_kwargs):
pass
4)處理響應(yīng)后:視圖函數(shù)調(diào)用之后烦味,所有響應(yīng)返回瀏覽器之前被調(diào)用聂使,在每個(gè)請(qǐng)求上調(diào)用,返回HttpResponse對(duì)象谬俄。
def process_response(self, request, response):
pass
5)異常處理:當(dāng)視圖拋出異常時(shí)調(diào)用柏靶,在每個(gè)請(qǐng)求上調(diào)用,返回一個(gè)HttpResponse對(duì)象溃论。
def process_exception(self, request,exception):
pass
示例
中間件是一個(gè)獨(dú)立的python類屎蜓,,可以定義這五個(gè)方法中的一個(gè)或多個(gè)钥勋。
1)在booktest/目錄下創(chuàng)建middleware.py文件炬转,代碼如下:
class my_mid:
def __init__(self):
print '--------------init'
def process_request(self,request):
print '--------------request'
def process_view(self,request, view_func, *view_args, **view_kwargs):
print '--------------view'
def process_response(self,request, response):
print '--------------response'
return response
2)在test5/settings.py文件中,向MIDDLEWARE_CLASSES項(xiàng)中注冊(cè)笔诵。
3)修改booktest/views.py中視圖index返吻。
def index(request):
print '======index======'
return render(request,'booktest/index.html')
4)運(yùn)行服務(wù)器,命令行中效果如下圖:
3)刷新頁面乎婿,命令行中效果如下圖:
異常中間件
1)在booktest/middleware.py中定義兩個(gè)異常類如下:
class exp1:
def process_exception(self,request,exception):
print '--------------exp1'
class exp2:
def process_exception(self,request,exception):
print '--------------exp2'
2)在test5/settings.py文件中测僵,向MIDDLEWARE_CLASSES項(xiàng)中注冊(cè)。
3)修改booktest/views.py中視圖index谢翎。
def index(request):
print '======index======'
raise Exception('自定義異常')
return render(request,'booktest/index.html')
總結(jié):如果多個(gè)注冊(cè)的中間件類中都有process_exception的方法捍靠,則先注冊(cè)的后執(zhí)行。