1.先来点真实的--定义
中间件是Django请求/响应处理钩子框架。他是一个轻量级的、低级的“插件系统”,用于全局改变Django的输入输出(请求响应)。
中间件以类的形式体现。
中间件组件负责做一些特定的功能。
1.什么是钩子框架?
Django的钩子框架指的是请求在进入主路由or视图函数前会经过特定的中间件,返回响应同样可以经过中间件,由中间件决定是否能够进入。(个人理解,类似过滤器)
2.代码层次
中间类都要继承Middlewaremixin类
中间件类需要实现五个方法中至少一个
1.process_request(self,request)
执行路由之前会被调用,在每个请求上调用,返回None则进入路由,若返回HttpResponse则不能进入路由。
2.process_view(self,request,callback,callback_args,callback_kwrags)
调用视图之间被调用,(同上)
3.process_response(self,request,response)
所有响应返回浏览器,在每个请求上调用,返回HttpResponse对象
4.process_exception(self,request,exception)
当处理过程抛出异常时调用,返回一个HttpResponse对象
5.process_templates(self,request,response)
在视图函数执行完毕且视图返回对象中包含render被调用;该方法需要返回实现了render方法的响应对象。
3.测试
首先在项目同级路径新建python包,并新建python文件,与manage.py同一级
from django.utils.deprecation import MiddlewareMixin
class myMW1(MiddlewareMixin):
def process_request(self,request):
print("我是%s,在进入路由前实行了"%(self.__class__.__name__))
def process_view(self,request,callback,callback_args,callback_kwrags):
print("我是%s,在进入视图前实行了"%(self.__class__.__name__))
def process_response(self,request,response):
print("我是%s,在返回响应前实行了"%(self.__class__.__name__))
return response
class myMW2(MiddlewareMixin):
def process_request(self,request):
print("我是%s,在进入路由前实行了"%(self.__class__.__name__))
def process_view(self,request,callback,callback_args,callback_kwrags):
print("我是%s,在进入视图前实行了"%(self.__class__.__name__))
def process_response(self,request,response):
print("我是%s,在返回响应前实行了"%(self.__class__.__name__))
return response
不要忘了在setting.py注册
MIDDLEWARE = [
'middleware.mymw.myMW1',
'middleware.mymw.myMW2'
]
结果:
结果分析:
从调用顺序的来看,在进视图以及之前都从setting.py从上到下,等出了视图就是从下到上了。