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

    Django中间件

    django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

    在django项目的settings模块中,有一个 MIDDLEWARE变量,其中每一个元素就是一个中间件,如下图。

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

    与manage.py在同一目录下的文件夹 项目/middleware下的auth.py文件中的Authentication类

    中间件中可以定义五个方法,分别是

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

    创建中间件类

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    
    class MD1(MiddlewareMixin):
    
        def process_request(self, request):
            # print(id(request))
            print('MD1 process_request')
            # return HttpResponse('md1')
    
        def process_response(self, request, response):
            # print(id(response))
            print('MD1 process_response')
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            # print(view_func, type(view_func))
            # print(view_args, type(view_args))
            # print(view_kwargs, type(view_kwargs))
            print('MD1 process_view')
            # return HttpResponse('md1')
    
        def process_exception(self, request, exception):
            print('MD1 process_exception')
            # print(exception)
    
        def process_template_response(self, request, response):
            print('MD1 process_template_response')
            response.context_data = {'index': '真的别想了!!'}
    
            return response
    
    
    class MD2(MiddlewareMixin):
    
        def process_request(self, request):
            print('MD2 process_request')
    
        def process_response(self, request, response):
            print('MD2 process_response')
            return response
    
        def process_view(self, request, view_func, view_args, view_kwargs):
            # print(view_func, type(view_func))
            # print(view_args, type(view_args))
            # print(view_kwargs, type(view_kwargs))
            print('MD2 process_view')
    
        def process_exception(self, request, exception):
            print('MD2 process_exception')
            # print(exception)
            return HttpResponse('已经处理完了')
    
        def process_template_response(self, request, response):
            print('MD2 process_template_response')
            response.context_data = {'index': '别想了'}
            return response
    

      

    注册中间件

    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)

    执行时间: 在视图函数之前

    参数:request request对象,跟视图函数中的是同一个

    执行顺序:按照注册的顺序顺序执行

    返回值:

    ​ None:正常流程

    HttpResponse对象:不执行下一个中间中的process_request方法,也不执行视图函数,直接执行当前中间件中的process_response方法

    process_response(self, request, response)

    ​ 执行时间: 在视图函数之后

    参数:

    ​ request request对象,跟视图函数中的是同一个

    ​ response: HttpResponse对象

    执行顺序:按照注册的顺序倒叙执行

    返回值:

    ​ HttpResponse对象:正常流程

    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(self, request, exception)

    执行时间: 有异常才触发执行 在视图函数之后

    参数:

    ​ request request对象,跟视图函数中的是同一个

    ​ exception 错误对象

    执行顺序:按照注册的顺序倒叙执行

    返回值:

    ​ None:正常流程,错误交给django处理

    ​ HttpResponse对象:下一个中间件中的process_exception方法不执行,,执行所有中间件的process_response方法

    process_template_response(self,request,response)

    执行时间: 视图返回的是TemplateResponse对象才执行,或者对象有一个render的方法

    参数:

    ​ request request对象,跟视图函数中的是同一个

    ​ response 响应对象

    执行顺序:按照注册的顺序倒叙执行

    返回值:

    ​ HttpResponse对象:正常流程

  • 相关阅读:
    mysql多表查询的方式有哪些?
    Linq无聊练习系列4--join练习
    Linq无聊练习系列3--聚合函数练习
    Linq无聊练习系列2--select/distinct练习
    Linq无聊练习系列1--where练习
    人力资源系统遇到的问题
    sqlserver游标概念与实例全面解说
    $.cookie的用法
    JavaScript系列----正则表达式
    ASP.NET中的URL编码解码
  • 原文地址:https://www.cnblogs.com/xinjie123/p/10962572.html
Copyright © 2011-2022 走看看