1. 定义
中间件是一个钩子框架,深入到django的请求/响应处理过程中。这是一个轻量、底层插件系统,目的是全局修改django的输入或输出。每一个中间件组件都是用来处理特定的功能。例如django中间件组件:AuthenticationMiddleware用来关联请求用户,采用的方式是使用session。
2. 原理
中间件工厂是一个可调用对象,接收get_response作为参数,并返回一个中间件,返回的中间件也是一个可调用对象,接收一个request,并返回一个response,向一个view函数,中间件工厂其实很像装饰器。具体实现方式有:函数方式(像使用函数实现的装饰器)、类方式(像使用类实现的装饰器)。示例代码如下:
def simple_middleware(get_response): # 这里添加代码:一次性配置和初始化 def middleware(request): # 这里添加代码:在view、下一个中间件执行之前执行的代码 response = get_response(request) # 这里添加代码:view调用之后,为每一个请求/响应代码 return response return middleware class SimpleMiddleware(object): def __init__(self, get_response): self.get_response = get_response # 这里添加代码:一次性配置和初始化 def __call__(self, request): # 这里添加代码:在view、下一个中间件执行之前执行的代码 response = get_response(request) # 这里添加代码:view调用之后,为每一个请求/响应代码 return response
get_response可调用对象是由django提供的:可能是一个真实的view函数(如果是最后列出的中间件)、或者中间件链中的下一个中间件。当前中间件不需要知道或者关心get_response是什么,只要明白它将呈现下一步内容。
3. 存放路径
中间件是存放在一个Python文件中,可能放在任意Python搜索文件方式的路径中,只要能够在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.middleware.clickjacking.XFrameOptionsMiddleware', ]
4. 解析步骤
根据请求阶段,在调用view函数之前,django按照定义在MIDDLEWARE中的顺序,从上往下应用中间件。请求是从上往下一层一层往下传递get_response,直到核心(view),响应则是返回来的顺序(由核心开始)。如果某一层决定短路并返回一个响应,而没有调用它的get_repsonse,那么在内部的层(包括view函数)都将被看不到请求和响应。
5. 中间件钩子
出了前面描述的基本请求响应中间件模式,你可以添加另外三个特殊的方法(基于类的中间件):
5.1. process_view():
process_view(request, view_func, view_args, view_kwargs)
5.2. process_exception():
process_exception(request, exception)
5.3. process_template_response():
process_template_response(request, response)