Django進階之中間件

中間件簡介

django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中間件中相應的方法。

在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一箇中間件

中間件中一共有四個方法:

process_request

process_view

process_exception

process_response

中間件之process_request,process_response

process_request(self,request)

process_response(self, request, response)

當用戶發起請求的時候會依次經過所有的的中間件,這個時候的請求時process_request,最後到達views的函數中,views函數處理後,在依次穿過中間件,這個時候是process_response,最後返回給請求者

在django中叫中間件,在其他web框架中,有的叫管道,httphandle

 

上述截圖中的中間件都是django中的,我們也可以自己定義一箇中間件,我們可以自己寫一個類,但是必須繼承MiddlewareMixin

所以需要導入:from django.utils.deprecation import MiddlewareMixin

我們在項目文件下創建一個Middle目錄,並在下面創建m1.py代碼例子如下:

複製代碼
#AUTHOR:FAN
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Row1(MiddlewareMixin):
    def process_request(self,request):
        print("中間件1請求")
    def process_response(self,request,response):
        print("中間件1返回")
        return response

class Row2(MiddlewareMixin):
    def process_request(self,request):
        print("中間件2請求")
        # return HttpResponse("走")
    def process_response(self,request,response):
        print("中間件2返回")
        return response

class Row3(MiddlewareMixin):
    def process_request(self,request):
        print("中間件3請求")
    def process_response(self,request,response):
        print("中間件3返回")
        return response
複製代碼

這樣當頁面發起請求的時候:後臺效果如下

但是如果當請求到達請求2的時候直接不符合條件返回,程序將吧請求直接發給中間件2返回,然後依次返回到請求者

用如下圖進行理解:

當然這是在django1.10的時候,在之前的版本的時候是直接返回到最後一箇中間件的response,然後向上依次返回,最後到發起請求

中間件之process_view

process_view(self, request, callback, callback_args, callback_kwargs)

我們在m1.py文件中的的代碼進行更改:

複製代碼
#AUTHOR:FAN
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Row1(MiddlewareMixin):
    def process_request(self,request):
        print("中間件1請求")
    def process_response(self,request,response):
        print("中間件1返回")
        return response

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中間件1view")

class Row2(MiddlewareMixin):
    def process_request(self,request):
        print("中間件2請求")
        # return HttpResponse("走")
    def process_response(self,request,response):
        print("中間件2返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中間件2view")

class Row3(MiddlewareMixin):
    def process_request(self,request):
        print("中間件3請求")
    def process_response(self,request,response):
        print("中間件3返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中間件3view")
複製代碼

高亮部分爲添加的內容,這樣運行之後效果如下:

我們通過下圖進行分析上面的過程:

當最後一箇中間的process_request到達路由關係映射之後,返回到中間件1的process_view,然後依次往下,到達views函數,最後通過process_response依次返回到達用戶

中間件之process_exception

process_exception(self, request, exception)

當views的函數中出現錯誤時,就會執行process_exception方法

如果在中間中添加了process_exception方法,工作圖示爲:

這樣當用戶發起請求的時候到達中間件3的process_request之後會到達urls路由關係映射這裏,如果匹配到了就會到中間件1的process_view,然後依次傳遞到中間件3的process_view,到達view函數。如果view函數中有報錯,則會從中間件3依次向上判斷每個中間件的process_exception是否能匹配到這個錯誤信息,如果匹配到則直接返回到最後一箇中間件,這裏即中間件3的process_response,然後依次返回到用戶,如果沒有匹配到這個錯誤則直接在頁面顯示錯誤信息。如果view函數中沒有錯誤,則到中間3即最後一箇中間件3的process_response,然後依次向上,傳到用戶

中間件之process_template_responseprocess

process_template_response(self,request,response)

只有當views函數中返回的對象中具有render方法,是就會直接process_template_responseprocess

 

所有的努力都值得期許,每一份夢想都應該灌溉!
發佈了66 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章