django如何自己創(chuàng)建一個(gè)中間件
中間件是什么?
中間件是類似flask函數(shù)中鉤子函數(shù)的東西??梢栽谡?qǐng)求視圖函數(shù)前,或者視圖函數(shù)響應(yīng)后處理某些事情。中間件對(duì)全部視圖都有效!
中間件一般會(huì)有兩個(gè)方法,process_request和process_response。分別用來處理請(qǐng)求到達(dá)視圖函數(shù)前,到達(dá)視圖函數(shù)后的事情。
編寫一個(gè)自定義的中間件
我們可以根據(jù)業(yè)務(wù)需要自己編寫一個(gè)中間件。在編寫中間件前,你需要讀一下django.utils.deprecation.MiddlewareMixin的源碼。
class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response
方法名 | 作用 | 返回值 | 備注 |
---|---|---|---|
__init__(self, get_response=None) | 服務(wù)器啟動(dòng)(重啟)時(shí)執(zhí)行一次 | 無 | -- |
process_request(self, request) | 在視圖執(zhí)行之前調(diào)用 |
|
-- |
process_response(self, request, response) | 在視圖執(zhí)行完之后調(diào)用 | 必須返回HttpResponse對(duì)象 | -- |
編寫自定義的中間件:
class My_middleware(MiddlewareMixin): def __init__(self,get_response=None): super().__init__(get_response) def process_request(self,request): """ 視圖函數(shù)前執(zhí)行的,一旦這里有return將到達(dá)不了視圖函數(shù) request是瀏覽器發(fā)過來的請(qǐng)求 """ print("視圖函數(shù)執(zhí)行前") def process_response(self,request,response): """ 視圖函數(shù)后執(zhí)行的 request是瀏覽器發(fā)過來的請(qǐng)求 response是視圖函數(shù)返回的響應(yīng) """ print("視圖函數(shù)執(zhí)行后") # 因?yàn)槟隳昧艘晥D函數(shù)的response,就算處理的業(yè)務(wù)與response無關(guān)也要返回response return response
中間件的注冊(cè)
MIDDLEWARE = [ ... 'middlewares.My_middleware' # 寫上自己的路徑 ]
多個(gè)中間件的執(zhí)行順序
?。?!如果你定義了多個(gè)中間件,記得注意一下中間件擺在setting.py文件的位置:
- 注冊(cè)中間件設(shè)置是由上到下執(zhí)行的,所以上面的中間件會(huì)先被注冊(cè)
- 對(duì)于視圖函數(shù)執(zhí)行前的process_request,先注冊(cè)的中間件會(huì)先執(zhí)行
- 對(duì)于視圖函數(shù)執(zhí)行后的process_response,后注冊(cè)的中間件會(huì)先執(zhí)行
例如:
先注冊(cè)中間件1,后注冊(cè)中間件2。
輸出結(jié)果是:
before 視圖(中間件1) before 視圖 2(中間件2) ==index== after 視圖 2(中間件2) after 視圖(中間件1)
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python常用驗(yàn)證碼標(biāo)注和識(shí)別(需求分析和實(shí)現(xiàn)思路)
通過本文的介紹,我們了解了Python在常用驗(yàn)證碼標(biāo)注和識(shí)別方面的應(yīng)用,在實(shí)際項(xiàng)目中,我們可以根據(jù)具體需求選擇合適的模型和工具,實(shí)現(xiàn)高效、準(zhǔn)確的驗(yàn)證碼標(biāo)注和識(shí)別,感興趣的朋友跟隨小編一起看看吧2024-03-03在Python中使用SimpleParse模塊進(jìn)行解析的教程
這篇文章主要介紹了在Python中使用SimpleParse模塊進(jìn)行解析的教程,文章來自于IBM官方的開發(fā)者技術(shù)文檔,需要的朋友可以參考下2015-04-04python編程使用協(xié)程并發(fā)的優(yōu)缺點(diǎn)
協(xié)程是一種用戶態(tài)的輕量級(jí)線程,又稱微線程。這篇文章主要介紹了python編程使用協(xié)程并發(fā)的優(yōu)缺點(diǎn),感興趣的朋友跟隨小編一起看看吧2018-09-09python numpy和list查詢其中某個(gè)數(shù)的個(gè)數(shù)及定位方法
今天小編就為大家分享一篇python numpy和list查詢其中某個(gè)數(shù)的個(gè)數(shù)及定位方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06如何實(shí)現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件
這篇文章主要介紹了如何實(shí)現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06Python通過tkinter實(shí)現(xiàn)百度搜索的示例代碼
這篇文章主要介紹了Python通過tkinter實(shí)現(xiàn)百度搜索的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04PyTorch零基礎(chǔ)入門之構(gòu)建模型基礎(chǔ)
PyTorch是一個(gè)開源的Python機(jī)器學(xué)習(xí)庫,基于Torch,用于自然語言處理等應(yīng)用程序,它是一個(gè)可續(xù)計(jì)算包,提供兩個(gè)高級(jí)功能:1、具有強(qiáng)大的GPU加速的張量計(jì)算(如NumPy)。2、包含自動(dòng)求導(dǎo)系統(tǒng)的深度神經(jīng)網(wǎng)絡(luò)2021-10-10