Python - Django - 中间件 process_response

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

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

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

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


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:

from django.shortcuts import HttpResponse


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

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

 

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

执行结果:

 

可以看到先执行 process_request,然后执行 views.py,最后执行 process_response

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

 

process_request 和 process_response 的执行流程:

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

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

如上图,中间件 3 返回了 HttpResponse,所以不再执行中间件 4、5、6 的 process_request 函数和 process_response 函数,而是继续执行中间件 3、2、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

posted @ 2019-09-12 20:40  Sch01aR#  阅读(2632)  评论(0编辑  收藏  举报