[TimLinux] Django 中间件

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)

猜你喜欢

转载自www.cnblogs.com/timlinux/p/9253497.html