Django中的中间件是一个轻量级,底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
定义一个中间件工厂函数,然后返回一个可以别调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个请求对象参数,返回一个响应对象。
def simple_middleware (get_response): #此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def中间件(请求): #此处编写的代码会在每个请求处理视图前被调用。 响应=get_response(请求) #此处编写的代码会在每个请求处理视图之后被调用。 返回响应 返回中间件
例如,在用户应用中新建一个middleware.py文件,
def my_middleware (get_response): 打印(“init被调用”) def中间件(请求): 打印(之前请求被调用”) 响应=get_response(请求) 打印(后响应被调用”) 返回响应 返回中间件
定义好中间件后,需要在设置。py文件中添加注册中间件
中间件=[ “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”, “users.middleware。my_middleware”, #添加中间件 )
定义一个视图进行测试
def demo_view(请求): print(的观点视图被调用的) 返回HttpResponse(“好”)
执行结果
注意:Django运行在调试模式下,中间件init部分有可能被调用两次。
-
<李>在请求视图被处理前,中间件由上至下依次执行李>
<李>在请求视图被处理后,中间件由下至上依次执行李>
示例:
定义两个中间件
def my_middleware (get_response): 打印(“init被调用”) def中间件(请求): 打印(之前请求被调用”) 响应=get_response(请求) 打印(后响应被调用”) 返回响应 返回的中间件 def my_middleware2 (get_response): 打印(“init2被调用”) def中间件(请求): 打印(之前请求2被调用的) 响应=get_response(请求) 打印(后反应2被调用的) 返回响应 返回中间件
注册添加两个中间件
中间件=[ “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”, “users.middleware。my_middleware”, #添加 “users.middleware。my_middleware2”, #添加 )
执行结果
init2被调用
引用>
init被调用
前请求被调用
前请求2被调用
观点视图被调用
反应2后被调用
反应后被调用总结:中间件的本质其实就是个装饰器,对于装饰器我之前的随笔里也详细说过,装饰器的本质其实就是个闭包
详解Django中间件执行顺序