中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
1 中间件的定义方法
定义一个中间件工厂函数,然后返回一个可以别调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
第一种自定义方法:
1 #定义中间件 2 def my_middleware(get_response): 3 print('init 被调用') 4 def middleware(request): 5 print('before request 被调用') 6 response = get_response(request) 7 print('after response 被调用') 8 return response 9 return middleware 10 11 #定义视图 12 def demo_view(request): 13 print('view 视图被调用') 14 return HttpResponse('OK') 15 16 17 #init 被调用 18 #before request 被调用 19 #view 视图被调用 20 #after response 被调用 21 22 views.py
第二种自定义方法:
process_request(self,request)
发送请求process_view(self, request, callback, callback_args, callback_kwargs)
执行完 request 预处理函数并确定待执行的 view 之后,但在 view 函数实际执行之前。process_template_response(self,request,response)
response参数应该是一个由view或者中间件返回的TemplateResponse对像(或等价的对象)。如果响应的实例有render()
方法,process_template_response()
会在view刚好执行完毕之后被调用。这个方法必须返回一个实现了render方法的响应对象。process_exception(self, request, exception)
收集错误信息,当一个view引发异常时,Django会调用process_exception()
来处理。返回一个None或一个HttpResponse对象。如果返回HttpResponse对象,会将响应交给处理响应的中间件处理。由于处理响应时是从下到上的,此层以上的process_exception()
是不会被调用的。process_response(self, request, response)
必须返回 HttpResponse 对象。这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
1 from django.utils.deprecation import MiddlewareMixin 2 class UserYanzheng(MiddlewareMixin): 3 #视图处理前触发 4 def process_request(self,request): 5 print("用户中间件验证------>1111111") 6 #视图处理以后返回response时出发 7 def process_response(self,request,response): 8 print("用户验证中间件的response部分---------->") 9 return response 10 11 12 13 #用户中间件验证------>1111111 14 #函数执行 15 #用户验证中间件的response部分---------->
2 执行流程
3 多个中间件的执行顺序
- 在请求视图被处理前,中间件由上至下依次执行
- 在请求视图被处理后,中间件由下至上依次执行
1 def my_middleware(get_response): 2 print('init 被调用') 3 def middleware(request): 4 print('before request 被调用') 5 response = get_response(request) 6 print('after response 被调用') 7 return response 8 return middleware 9 10 def my_middleware2(get_response): 11 print('init2 被调用') 12 def middleware(request): 13 print('before request 2 被调用') 14 response = get_response(request) 15 print('after response 2 被调用') 16 return response 17 return middleware 18 19 def zhong1(get_response): 20 print("我是测试1111") 21 def jian(request): 22 if request.path == "/app01/login/": 23 print('我是测试222222') 24 response = get_response(request) 25 print("我是测试3333") 26 else: 27 print('我是测试二二二二二二') 28 response = get_response(request) 29 print("我是测试3333") 30 31 return response 32 return jian 33 34 35 from django.utils.deprecation import MiddlewareMixin 36 class UserYanzheng(MiddlewareMixin): 37 def process_request(self,request): 38 print("用户中间件验证------>1111111") 39 40 def process_response(self,request,response): 41 print("用户验证中间件的response部分---------->") 42 return response
1 MIDDLEWARE = [ 2 'django.middleware.security.SecurityMiddleware', 3 'django.contrib.sessions.middleware.SessionMiddleware', 4 'django.middleware.common.CommonMiddleware', 5 # 'django.middleware.csrf.CsrfViewMiddleware', 6 'django.contrib.auth.middleware.AuthenticationMiddleware', 7 'django.contrib.messages.middleware.MessageMiddleware', 8 'django.middleware.clickjacking.XFrameOptionsMiddleware', 9 'corsheaders.middleware.CorsMiddleware', 10 'ppapp01.views.my_middleware2', 11 'ppapp01.views.my_middleware', 12 'ppapp01.views.zhong1', 13 'ppapp01.views.UserYanzheng', 14 ]
我是测试1111 init 被调用 init2 被调用 before request 2 被调用 before request 被调用 我是测试二二二二二二 用户中间件验证------>1111111 函数执行 用户验证中间件的response部分----------> 我是测试3333 after response 被调用 after response 2 被调用