zoukankan      html  css  js  c++  java
  • django中间件-12

    在django中,中间件其实就是一个类,他是一个可以介入django的 requestresponse 的钩子框架,在请求响应不同的阶段,执行类中不同的代码,用于在全局修改django的输入输出。

    自定义中间件

    自定义中间件有两种方式,使用函数定义,和使用类定义。

    自定义中间件一般定义在项目目录或者‘应用目录下的 middleware.py 文件下。

    函数定义

    def simple_middleware(get_response):
        # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
    
        def middleware(request):
            # 此处编写的代码会在每个请求处理视图前被调用。
    
            response = get_response(request)
    
            # 此处编写的代码会在每个请求处理视图之后被调用。
    
            return response
    
        return middleware
    

    示例

    def simple_middleware(get_response):
        print("django被初始化")
    
        def middleware(request):
            print("请求")
            response = get_response(request)
            print("响应")
            return response
        return middleware
    

    访问视图执行结果

    django被初始化
    [20/Oct/2018 09:44:54] "POST /middleware HTTP/1.1" 200 12
    请求
    视图函数
    响应
    

    类定义

    class SimpleMiddleware(object):
        def __init__(self, get_response):
            self.get_response = get_response
            # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
    
        def __call__(self, request):
            # 此处编写的代码会在每个请求处理视图前被调用。
    
            response = self.get_response(request)
            # 此处编写的代码会在每个请求处理视图之后被调用。
    
            return response
    

    示例

    class SimpleMiddleware(object):
        def __init__(self, get_response):
            self.get_response = get_response
            print("初始化")
    
        def __call__(self, request):
            print("请求")
    
            response = self.get_response(request)
            print("响应")
    
            return response
    

    访问视图执行结果

    django初始化
    [20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
    请求
    视图函数
    响应
    

    与旧版本中间件的兼容

    在Django 1.10版本之前,中间件设置名为MIDDLEWARE_CLASSES,是长这样的:

    class Middleware(MiddlewareMixin):
    
        def __init__(self, get_response=None):
            # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
            self.get_response = get_response
    
        def process_request(self, request):
           # 此处编写的代码会在每个请求处理视图前被调用。
    
        def process_response(self, request, response):
            # 此处编写的代码会在每个请求处理视图之后被调用。
    
            return response
    

    示例

    class Middleware(MiddlewareMixin):
    
        def __init__(self, get_response=None):
            print("django初始化")
            self.get_response = get_response
    
        def process_request(self, request):
            print("请求")
    
        def process_response(self, request, response):
            print("响应")
    
            return response
    

    访问视图执行结果

    django初始化
    [20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
    请求
    视图函数
    响应
    
    • 参数get_response代表被访问的视图函数

    中间件的执行顺序

    中间件的执行顺序和注册顺序有关系。在视图函数处理前,会按注册顺序从上往下执行。在属兔函数处理后,会按注册顺序从上往下执行, 在初始化的时候,也是从下往上执行。

    示例

    定义两个中间件

    def simple_middleware(get_response):
        print("django被初始化")
    
        def middleware(request):
            print("请求")
            response = get_response(request)
            print("响应")
            return response
        return middleware
    
    
    class SimpleMiddleware(object):
        def __init__(self, get_response):
            self.get_response = get_response
            print("初始化")
    
        def __call__(self, request):
            print("请求")
    
            response = self.get_response(request)
            print("响应")
    
            return response
    

    注册顺序

    MIDDLEWARE = [
        'middleware.middleware.simple_middleware',
        'middleware.middleware.SimpleMiddleware',
    

    执行结果

    初始化2
    django被初始化1
    请求1
    请求2
    视图函数
    响应2
    响应1
    
  • 相关阅读:
    [HDU 3038] How Many Answers Are Wrong
    [BZOJ 4977][Lydsy1708月赛]跳伞求生
    [BZOJ4974] 字符串大师
    总结-exCRT
    [luogu 4777] exCRT
    [AHOI 2009] 中国象棋
    JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember
    十一黄金周 加班加点随笔
    从两个设计模式到前端MVC-洪宇
    Todo&Rocket
  • 原文地址:https://www.cnblogs.com/mxuanli/p/9850602.html
Copyright © 2011-2022 走看看