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
    
  • 相关阅读:
    如何批量删除Redis数据库中的Key
    关于 no device found for connection ‘ System eth0′问题
    nginx配置vhost配置文件详解
    Linux教程之:Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)
    Nginx配置文件详细说明
    swoole使用 常用案例
    超好用的一个JQUERY分页器-jpaginate
    如何解决chrome 等浏览器不支持本地ajax请求的问题
    PHP设计模式之单例模式
    IE和其他浏览器用JS新窗口打开的问题
  • 原文地址:https://www.cnblogs.com/mxuanli/p/9850602.html
Copyright © 2011-2022 走看看