• Python


    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

  • 相关阅读:
    【转】36个经典的JQuery导航菜单演示+下载
    【转】ASP.NET 3.5 开发范例精讲精析读书笔记
    【转】js弹出框详解
    【转】谈谈三层架构中MODEL的作用
    【转】制作.net实体类生成器(1)
    ASP.NET开发实战宝典.pdf配套视频源码iso| 开发实战宝典pdf和配套视频源码iso
    【转】if (!IsPostBack)
    jquery
    取web.config 连接字符串
    js接收传递过来的参数
  • 原文地址:https://www.cnblogs.com/sch01ar/p/11515067.html
Copyright © 2020-2023  润新知