助力软件开发企业降本增效 PHP / java源码系统,只需一次付费,代码终身使用! 广告
[TOC] 在django中,中间件其实就是一个类,他是一个可以介入django的 `request` 和 `response` 的钩子框架,在请求响应不同的阶段,执行类中不同的代码,用于在全局修改django的输入输出。 ## 自定义中间件 自定义中间件有两种方式,使用函数定义,和使用类定义。 自定义中间件一般定义在项目目录或者‘应用目录下的 `middleware.py` 文件下。 ### 函数定义 ```python def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def middleware(request): # 此处编写的代码会在每个请求处理视图前被调用。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response return middleware ``` 示例 ```python 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 请求 视图函数 响应 ``` ### 类定义 ```python 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 ``` 示例 ```python 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,是长这样的: ```python 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 ``` 示例 ```python 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代表被访问的视图函数 ## 中间件的执行顺序 中间件的执行顺序和注册顺序有关系。在视图函数处理前,会按注册顺序从上往下执行。在属兔函数处理后,会按注册顺序从上往下执行, 在初始化的时候,也是从下往上执行。 ![](https://box.kancloud.cn/b12280686a5e2400f977232640b7c17c_880x169.png) 示例 定义两个中间件 ```python 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 ``` 注册顺序 ```python MIDDLEWARE = [ 'middleware.middleware.simple_middleware', 'middleware.middleware.SimpleMiddleware', ``` 执行结果 ``` 初始化2 django被初始化1 请求1 请求2 视图函数 响应2 响应1 ```