Django中間件

在django中叫中間件,在其餘web框架中,有的叫管道,httphandle,本次主要介紹定義中間件方法、中間件中的方法、中間件的做用等。 html

自定義中間件

一、中間件爲:函數

定義一箇中間件工廠函數,而後返回一個能夠別調用的中間件。web

中間件工廠函數須要接收一個能夠調用的get_response對象。django

返回的中間件也是一個能夠被調用的對象,而且像視圖同樣須要接收一個request對象參數,返回一個response對象。segmentfault

def simple_middleware(get_response): # 此處編寫的代碼僅在Django第一次配置和初始化的時候執行一次。

    def middleware(request): # 此處編寫的代碼會在每一個請求處理視圖前被調用。
 response = get_response(request) # 此處編寫的代碼會在每一個請求處理視圖以後被調用。

        return response return middleware

 

例如,在users應用中新建一個middleware.py文件,緩存

def my_middleware(get_response): print('init 被調用') def middleware(request): print('before request 被調用') response = get_response(request) print('after response 被調用') return response return middleware

定義好中間件後,須要在settings.py 文件中添加註冊中間件session

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', 'users.middleware.my_middleware',  # 添加中間件
]

定義一個視圖進行測試框架

def demo_view(request): print('view 視圖被調用') return HttpResponse('OK')

 執行結果函數

  

  注意:Django運行在調試模式下,中間件init部分有可能被調用兩次。測試

 

二、中間件爲:類

咱們能夠本身寫一個類,做爲中間件,可是必須繼承MiddlewareMixin, 因此須要導入:from django.utils.deprecation import MiddlewareMixinspa

中間件合法的5種方法:

process_request(self, request): # 請求時過濾

#request:請求信息, callback:函數名, callback_args:函數可變參數(元組調用), callback_kwargs:函數關鍵字參數(字典調用) process_view(self, request, callback, callback_args, callback_kwargs) # 視圖函數過濾
process_exception(self, request, exception) # views內代碼異常執行,exception:異常信息
process_template_response(self, request, exception) # 若是views返回的對象有render方法 則該函數被執行
process_response(self, request, response): # 返回時過濾

 

 中間件的各方法執行順序

 

自定義中間件步驟:

【1】在App目錄下建立名爲middlewares的包

【2】在包中建立本身的中間件類文件

verifycodeMiddleware.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import redirect class VerifycodeMiddleware(MiddlewareMixin): def process_request(self, request): print("***************", request.path) if request.path == "/login/" and request.method == "POST": # 判斷驗證碼 verifycode = request.POST.get("verifycode") if not verifycode.upper() == request.session.get("verifycode").upper(): return redirect("/login/")

【3】在settings.py文件中配阿置MIDDLEWARE

'myApp.middlewares.verifycodeMiddleware.VerifycodeMiddleware'

 

中間件的使用場景

1.作IP限制

放在中間件類的列表中,阻止某些ip訪問;

2.URL訪問過濾

若是用戶訪問的是logo視圖(放過)

若是訪問其餘視圖,須要檢測是否已經有session,已經有了放行,若是沒有返回login,這樣就省的在多個視圖函數上寫裝飾器了!

3.緩存

客戶端請求來了,中間件去緩存看看有沒有數據,有直接返回給用戶,沒有再去邏輯層執行視圖函數

 

 

 

參考:

https://blog.csdn.net/qq_31479309/article/details/80080851
http://www.javashuo.com/article/p-esiphkss-cv.html

http://www.javashuo.com/article/p-spqvdirp-cw.html

相關文章
相關標籤/搜索