zoukankan      html  css  js  c++  java
  • 中间件

    process_request

    请求来的时候 会从上往下依次经过每一个中间件里面process_request,一旦里面返回了HttpResponse对象那么就不再往后执行了

    from django.utils.deprecation import MiddlewareMixin
    
    
    class MD1(MiddlewareMixin):
    
        def process_request(self, request):
            print("MD1里面的 process_request")
    
    
    class MD2(MiddlewareMixin):
        def process_request(self, request):
            print("MD2里面的 process_request")
            pass
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'middlewares.MD1',  # 自定义中间件MD1
        'middlewares.MD2'  # 自定义中间件MD2
    ]
    
    #打印终端
    MD1里面的 process_request
    MD2里面的 process_request
    视图层..
    

    总结:

    1. 中间件的process_request方法是在执行视图函数之前执行的。

    2. 当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次 执行的。

    3. 不同中间件之间传递的request都是同一个对象

    process_response

    from django.utils.deprecation import MiddlewareMixin
    
    
    class MD1(MiddlewareMixin):
    
        def process_request(self, request):
            print("MD1里面的 process_request")
    
        def process_response(self, request, response):
            print("MD1里面的 process_response")
            return response
    
    
    class MD2(MiddlewareMixin):
        def process_request(self, request):
            print("MD2里面的 process_request")
            pass
    
        def process_response(self, request, response):
            print("MD2里面的 process_response")
            return response
    
    #打印终端
    MD1里面的 process_request
    MD2里面的 process_request
    视图...
    MD2里面的 process_response
    MD1里面的 process_response
    

    总结: process_response:响应走的时候 会从下往上依次进过每一个中间件里面的process_response#

    process_view

    from django.utils.deprecation import MiddlewareMixin
    
    
    class MD1(MiddlewareMixin):
    
        def process_request(self, request):
            print("MD1里面的 process_request")
    
        def process_response(self, request, response):
            print("MD1里面的 process_response")
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print("-" * 80)
            print("MD1 中的process_view")
            print(view_func, view_func.__name__)
    
    
    class MD2(MiddlewareMixin):
        def process_request(self, request):
            print("MD2里面的 process_request")
            pass
    
        def process_response(self, request, response):
            print("MD2里面的 process_response")
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            print("-" * 80)
            print("MD2 中的process_view")
            print(view_func, view_func.__name__)
    
    #打印终端
    MD1里面的 process_request
    MD2里面的 process_request
    --------------------------------------------------------------------------------
    MD1 中的process_view
    <function index at 0x000001DE68317488> index
    --------------------------------------------------------------------------------
    MD2 中的process_view
    <function index at 0x000001DE68317488> index
    app01 中的 index视图
    MD2里面的 process_response
    MD1里面的 process_response
    

    总结: 它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理 这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,那么将不会执行Django的视图函数,而是直 接在中间件中掉头,倒叙执行一个个process_response方法,最后返回给浏览器 。

    即路由匹配成功之后执行视图函数之前触发

    process_exception(用的不多)

    当视图函数出现异常(bug)的时候自动触发

    process_template_response(几乎不用)

    当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发

  • 相关阅读:
    第二周
    7月课程
    自定义线程池的创建
    jvm8内存模型和内存分配
    多线程中 CountDownLatch CyclicBarrier Semaphore的使用
    HashMap Hashtable TreeMap LinkedHashMap 分析
    HashSet LinkedHashSet TreeSet 分析
    ArrayList Vector LinkedList分析
    Java之流水号生成器实现
    mysql-mmm 部署高可用集群
  • 原文地址:https://www.cnblogs.com/qwksjy/p/11767130.html
Copyright © 2011-2022 走看看