zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    在同一asp.net website工程中引用app_code中定义的control
    perl中的ppm 安装包时,如果通过代理如何下载最新的包及离线安装的问题
    利用htc s900拨号上联通3G网
    转载一篇有关ramdisk 的使用的文章
    .net dataTable对象的处理性能
    TPlink 340G+设置外网访问内网机器
    C++中的const关键字(zz)
    存在 汪峰
    ETW (Event Tracing for Windows)介绍
    理解smart pointer之一(auto_ptr介绍)
  • 原文地址:https://www.cnblogs.com/sch01ar/p/11515067.html
Copyright © 2011-2022 走看看