django如何自己創(chuàng)建一個(gè)中間件
中間件是什么?
中間件是類似flask函數(shù)中鉤子函數(shù)的東西??梢栽谡?qǐng)求視圖函數(shù)前,或者視圖函數(shù)響應(yīng)后處理某些事情。中間件對(duì)全部視圖都有效!

中間件一般會(huì)有兩個(gè)方法,process_request和process_response。分別用來(lái)處理請(qǐng)求到達(dá)視圖函數(shù)前,到達(dá)視圖函數(shù)后的事情。
編寫(xiě)一個(gè)自定義的中間件
我們可以根據(jù)業(yè)務(wù)需要自己編寫(xiě)一個(gè)中間件。在編寫(xiě)中間件前,你需要讀一下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í)行一次 | 無(wú) | -- |
| process_request(self, request) | 在視圖執(zhí)行之前調(diào)用 |
|
-- |
| process_response(self, request, response) | 在視圖執(zhí)行完之后調(diào)用 | 必須返回HttpResponse對(duì)象 | -- |
編寫(xiě)自定義的中間件:
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ā)過(guò)來(lái)的請(qǐng)求
"""
print("視圖函數(shù)執(zhí)行前")
def process_response(self,request,response):
"""
視圖函數(shù)后執(zhí)行的
request是瀏覽器發(fā)過(guò)來(lái)的請(qǐng)求
response是視圖函數(shù)返回的響應(yīng)
"""
print("視圖函數(shù)執(zhí)行后")
# 因?yàn)槟隳昧艘晥D函數(shù)的response,就算處理的業(yè)務(wù)與response無(wú)關(guān)也要返回response
return response
中間件的注冊(cè)
MIDDLEWARE = [ ... 'middlewares.My_middleware' # 寫(xiě)上自己的路徑 ]
多個(gè)中間件的執(zhí)行順序

?。。∪绻愣x了多個(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)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch + visdom 處理簡(jiǎn)單分類問(wèn)題的示例
這篇文章主要介紹了pytorch + visdom 處理簡(jiǎn)單分類問(wèn)題的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python常用驗(yàn)證碼標(biāo)注和識(shí)別(需求分析和實(shí)現(xiàn)思路)
通過(guò)本文的介紹,我們了解了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)行解析的教程,文章來(lái)自于IBM官方的開(kāi)發(fā)者技術(shù)文檔,需要的朋友可以參考下2015-04-04
python編程使用協(xié)程并發(fā)的優(yōu)缺點(diǎn)
協(xié)程是一種用戶態(tài)的輕量級(jí)線程,又稱微線程。這篇文章主要介紹了python編程使用協(xié)程并發(fā)的優(yōu)缺點(diǎn),感興趣的朋友跟隨小編一起看看吧2018-09-09
python numpy和list查詢其中某個(gè)數(shù)的個(gè)數(shù)及定位方法
今天小編就為大家分享一篇python numpy和list查詢其中某個(gè)數(shù)的個(gè)數(shù)及定位方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
如何實(shí)現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件
這篇文章主要介紹了如何實(shí)現(xiàn)在pycharm中將.ui文件轉(zhuǎn)化為.py文件,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
Python通過(guò)tkinter實(shí)現(xiàn)百度搜索的示例代碼
這篇文章主要介紹了Python通過(guò)tkinter實(shí)現(xiàn)百度搜索的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
PyTorch零基礎(chǔ)入門之構(gòu)建模型基礎(chǔ)
PyTorch是一個(gè)開(kāi)源的Python機(jī)器學(xué)習(xí)庫(kù),基于Torch,用于自然語(yǔ)言處理等應(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

