中间件

发布于 2020-01-23 20:33:37   阅读量 118  点赞 0  

 中间件是一个处理Django请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django应用的输入输出。中间件帮助我们在视图函数执行之前和执行之后做一些重复的、针对所有请求与响应进行的操作。其作用在wsgi之后urls.py之前。

 由于中间件影响的全局的输入输出,所以需谨慎使用,使用不当会导致性能下降

 中间件的本质是一段可执行的程序,其接收一个可调用的get_reponse并返回中间件。其中get_response响应可能是实际视图(若该中间件为最后一层),或为调用链中的下一层中间件。我们不需要知道或关系当前中间件是什么,它只是代表了下一步的操作。


一、注册中间件

 若要激活中间件,需要将其字符串表示添加到settings.pyMIDDLEWARE列表中。一般在项目文件夹下新建一个 python文件,用来存放自定义的中间件,而在注册的时候直接使用文件名.中间件名即可。

列表默认为:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

 列表中中间件的顺序很重要,因为中间件会依赖其他的中间件。  

中间件顺序与分层

 在传递请求阶段,调用视图函数之前,Django按照中间件在MIDDLEWARE中的注册顺序,自顶向下执行中间件的对应逻辑(非所有逻辑)。而返回响应式,响应以相反的顺序通过每个中间件。

 若其中的一层中间件决定停止传递请求并返回响应而不调用get_response(此时需自己构造response对象),则之后的层(包括视图)将不会接收到请求,响应将沿着原传入的相同层返回。



二、自定义中间件

 创建中间件一般有三种方式:基于函数的中间件 基于可调用类的中间件 继承自MiddlewareMixin的中间件,以上第三种方法已被遗弃,一般使用前两种:

1.基于函数的中间件

示例:

def MyMiddleware(get_response):
    def middleware(request):

        # request对象到达下一层中间件或视图前执行的代码

        response = get_response(request)    #相当于执行下一层

        # response返回上一层中间件或浏览器前执行的代码

        return response
    return middleware


2.基于类的中间件

示例:

class MyMiddleware(object):
    def __init__(self,get_response):    #初始化中间件
        self.get_response = get_response

    def __call__(self,request):     #该类的实例被调用时执行

        # request对象到达下一层中间件或视图前执行的代码

        response = self.get_response(request)   #相当于执行下一层

        # response返回上一层中间件或浏览器前执行的代码

        return response


3.遗弃的写法

 基于定义类的process_request()get_response()process_response()实现流程化处理的中间件,这里不做过多介绍。  


Last Modified : 2021-03-27 14:00:40