一 原理
1. 裝飾器豆巨,是利用閉包的原理去更改一個(gè)函數(shù)的功能蜻拨,可以理解為讓一個(gè)函數(shù)執(zhí)行之前压怠,去另外一個(gè)函數(shù)里面執(zhí)行其他的語(yǔ)句眠冈,通常使用裝飾器來(lái)管理權(quán)限,登錄等菌瘫。實(shí)現(xiàn)代碼的重用性和耦合性蜗顽。
2.中間件,是利用面向切片的編程思想雨让。對(duì)django的服務(wù)器訪問(wèn)過(guò)程中實(shí)現(xiàn)干預(yù)诫舅。是一個(gè)輕量級(jí)、底層的插件系統(tǒng)宫患,可以介入Django的請(qǐng)求和響應(yīng)處理過(guò)程刊懈,修改Django的輸入或輸出。
每個(gè)中間件組件是一個(gè)獨(dú)立的Python類(lèi)娃闲,可以定義下面方法中的一個(gè)或多個(gè)
_init _:無(wú)需任何參數(shù)虚汛,服務(wù)器響應(yīng)第一個(gè)請(qǐng)求的時(shí)候調(diào)用一次,用于確定是否啟用當(dāng)前中間件
process_request(request):執(zhí)行視圖之前被調(diào)用皇帮,在每個(gè)請(qǐng)求上調(diào)用卷哩,返回None或HttpResponse對(duì)象
process_view(request, view_func, view_args, view_kwargs):調(diào)用視圖之前被調(diào)用,在每個(gè)請(qǐng)求上調(diào)用属拾,返回None或HttpResponse對(duì)象
process_template_response(request, response):在視圖剛好執(zhí)行完畢之后被調(diào)用将谊,在每個(gè)請(qǐng)求上調(diào)用,返回實(shí)現(xiàn)了render方法的響應(yīng)對(duì)象
process_response(request, response):所有響應(yīng)返回瀏覽器之前被調(diào)用渐白,在每個(gè)請(qǐng)求上調(diào)用尊浓,返回HttpResponse對(duì)象
process_exception(request,response,exception):當(dāng)視圖拋出異常時(shí)調(diào)用,在每個(gè)請(qǐng)求上調(diào)用纯衍,返回一個(gè)HttpResponse對(duì)象使用中間件栋齿,可以干擾整個(gè)處理過(guò)程,每次請(qǐng)求中都會(huì)執(zhí)行中間件的這個(gè)方法
二. 區(qū)別和聯(lián)系
區(qū)別:一個(gè)是Python的語(yǔ)法功能,一個(gè)是Django 框架自帶的輕量級(jí)插件系統(tǒng)瓦堵。
聯(lián)系:中間件是利用裝飾器原理實(shí)現(xiàn)的基协,具體通過(guò)兩個(gè)函數(shù)嵌套、或通過(guò)改寫(xiě)類(lèi)中的__ call __方法實(shí)現(xiàn)一個(gè)裝飾器功能菇用。使之過(guò)來(lái)的Request的請(qǐng)求澜驮,先到call方法中進(jìn)行處理。配置中間件惋鸥,實(shí)現(xiàn)過(guò)程干預(yù)泉唁。