中间件

目录

    https://www.cnblogs.com/maple-shaw/articles/9333824.html

    中间件

    ​ 中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

    Django项目的Settings.py文件,MIDDLEWARE配置项。

    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',
        'app01.middleware.my_middleware.MD1',
        'app01.middleware.my_middleware.MD2',
    ]
    

    自定义中间件

    process_request(self,request)
    process_view(self, request, view_func, view_args, view_kwargs)
    process_template_response(self,request,response)
    process_exception(self, request, exception)
    process_response(self, request, response)
    
    返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
    

    示例

    # from django.middleware.csrf import CsrfViewMiddleware  # 中间件源代码
    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")
    

    django中间件就是一个类, 在全局范围内处理django的输入和输出 .

    process_request方法

    process_request(self, request)
    执行时间: 在视图函数之前
    执行顺序: 按照注册的顺序执行
    参数:    
        	 request对象, 与视图函数中的相同
    返回值:   
        	 None :正常流程
             HttpResponse对象 :不执行下一个process_request方法, 也不执行下一个视图函数, 直接执行当前中间件的process_response方法. 
    

    process_response方法

    process_response(self, request, response):
    执行时间: 在视图函数之后
    执行顺序: 按照注册顺序倒序执行
    参数:    
        	 request: request对象, 与视图函数中的相同
    		 response: HttpResponse对象
    返回值:
        	 HttpResponse对象: 正常流程
    

    process_view方法

    process_view(self, request, view_func, view_args, view_kwargs):
    执行时间: 在process_request之后, 视图函数之前
    执行顺序: 按照注册的顺序执行
    参数:
    		 request: request对象, 与视图函数中的相同
    		 view_func: 要执行的视图函数
    		 view_args: 视图函数的位置参数
    		 view_kwargs: 视图函数的关键字参数
    返回值:
    		 None: 正常流程
    		 HttpResponse对象: 下一个中间件的process_view方法不执行, 视图函数不执行, 执行所有中间件的process_response方法
    

    process_exception方法

    process_exception(self, request, exception):
    执行时间: 有异常才会触发执行, 在视图函数之后
    执行顺序: 按照注册顺序倒叙执行
    参数:
    		 request: request对象, 与视图函数中的相同
    		 exception :错误对象
    返回值:
    		 None: 正常流程,错误交给下一个方法或者django处理异常
    		 HttpResponse对象: 下一个中间件中的process_exception方法不执行, 执行所有中间件的process_response方法. 
    

    process_template_response方法

    process_template_response(self, request, response):
    执行时间: 视图返回的是TemplateResponse对象才执行, 或者对象有一个render方法
    执行顺序: 按照注册顺序倒叙执行
    参数:
    		 request: request对象, 与视图函数中的相同
    		 response: 相应对象
    返回值:
    		 HttpResponse对象: 正常流程
    

    posted @ 2019-07-10 09:08  言值  阅读(113)  评论(0编辑  收藏  举报