Python - Django - 中間件 process_view


process_view 的執行順序也是按照 settings.py 中的順序來執行

process_view 在 urls.py 的對應關系之后,在執行視圖函數之前執行

如果返回 None,則繼續執行后面的中間件的 process_view 函數

如果返回 HttpResponse,則不執行后續的 process_view 函數,直接跳到第一個 process_response 函數執行

middleware_test.py:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse


class Test(MiddlewareMixin):
    def process_request(self, request):
        print("這是一個中間件 --> test")

    def process_response(self, request, response):
        print("這里是 Test 的 HttpResponse")
        return HttpResponse("這是 Test 返回的 HttpResponse")

    def process_view(self, request, view_func, view_args, view_kwargs):
        '''
        :param request: 瀏覽器發來的 request 請求對象
        :param view_func: 將要執行的視圖函數的名字
        :param view_args: 將要執行的視圖函數的位置參數
        :param view_kwargs: 將要執行的視圖函數的關鍵字參數
        :return:
        '''
        print("這里是 Test 的 process_view 函數")
        print(view_func, type(view_func))


class Test2(MiddlewareMixin):
    def process_request(self, request):
        print("這是一個中間件 --> test2")

    def process_response(self, request, response):
        print("這里是 Test2 的 HttpResponse")
        return HttpResponse("這是 Test2 返回的 HttpResponse")

    def process_view(selfm, request, view_func, view_args, view_kwargs):
        print("這個是 Test2 的 process_view 函數")
        print(view_func, type(view_func))

views.py:

from django.shortcuts import HttpResponse


def index(request):
    print("這里是 index 頁面")
    return HttpResponse("這里是主頁面 index")

訪問,http://127.0.0.1:8000/index/

 

運行結果:

 

 

執行流程:

首先執行 process_request 函數,然后在執行視圖函數之前執行 process_view 函數,然后執行視圖函數,最后執行 process_response 函數

 

process_request 只返回 None,都執行完之后,就匹配路由,找到要執行的視圖函數,在執行視圖函數之前先執行中間件的 process_view 函數

如果 process_view 返回 None,就繼續執行后續的中間件的 process_view 方法,執行完所有的 process_view 函數之后就執行視圖函數

如果其中有個 process_view 返回了 HttpResponse,就不執行后續的 process_view 函數,會跳到第一個 process_response 函數,並繼續往下執行

例如,中間件 3 的 process_view 返回了 HttpResponse,就不再執行后續的中間件 4、5、6 的中間件了,直接跳到中間件 6 的 process_response 函數,並接着執行中間件 5、4、3、2、1

 

如果有 process_request 函數返回了 HttpResponse 對象,就不執行后續的 process_request 函數,也不執行 process_view 函數,直接跳轉到相應的 process_response 函數執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM