Python - Django - 中间件 process_response

process_response 函数是执行完 views.py 后执行的函数python

process_response 函数有两个参数,一个是 request,一个是 response,response 是视图函数返回的响应对象django

process_response 函数的返回值必须是 HttpResponse 对象函数

middleware_test.py:url

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")


class Test2(MiddlewareMixin):
    def process_request(self, request):
        print("这是一个中间件 --> test2")

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

views.py:3d

from django.shortcuts import HttpResponse


def index(request):
    print("这里是 index 页面")
    return HttpResponse("这里是主页面 index")

访问,http://127.0.0.1:8000/index/中间件

 

这里没有返回 index 函数中的内容,而是直接返回 process_response 中的内容对象

执行结果:blog

 

能够看到先执行 process_request,而后执行 views.py,最后执行 process_responseio

并且 process_request 按照中间件的顺序执行,而 process_response 是反着执行的class

 

process_request 和 process_response 的执行流程:

中间件收到 request 请求后,先执行 process_request 函数,当返回响应时,再执行 process_response 函数

当 process_request 函数返回 HttpResponse 时,就再也不执行后面的 process_request 函数,而会去执行 process_response 函数

如上图,中间件 3 返回了 HttpResponse,因此再也不执行中间件 四、五、6 的 process_request 函数和 process_response 函数,而是继续执行中间件 三、二、1 的 process_response 函数

middleware_test.py:

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

allow_url = ['/admin/', '/uploads/', '/files/']


class Test(MiddlewareMixin):
    def process_request(self, request):
        print("这是一个中间件 --> test")

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


class Test2(MiddlewareMixin):
    def process_request(self, request):
        print("这是一个中间件 --> test2")
        if request.path_info in allow_url:
            return
        else:
            return HttpResponse("--- Test2 ---")

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

访问,http://127.0.0.1:8000/index/

 

运行结果:

 

由于 Test2 中 process_request 中返回了 HttpResponse,因此这里只执行了 Test2 的 process_response 方法,而再也不去执行后面的中间件 Test1

相关文章
相关标签/搜索