中间件
视图函数适合实现业务功能的纵向切割,我们可以将不同的业务逻辑, 分解到不同的视图函数中去实现。
但并不是所有的代码都适合放在视图函数中实现。例如,我们希望通过 检测请求对象是否携带了指定的cookie来判断用户是否为第一次访问,并 将第一次访问的用户重定向到一个新手页面。
显然,在每个视图函数里都去重复这一功能不算一个好的设计。更好的 方案是在请求分发之前,框架提供一个接口以便应用程序注入代码,拦截 请求对象并进行必要的处理。
在Django框架中,这样的接口称为中间件接口。一个Django的中间件 就是一个实现了预定义接口方法的类。Django根据注入时间的不同(比如, 处理请求之前还是之后),将中间件区分为不同的类别,分别需要实现不同 的接口方法。
对于上面的示例需求,我们可以定义一个请求处理中间件,它只需要实现 一个process_request()方法,Django框架将在向视图分发请求之前调用 请求中间件:
class FreshmanMiddleware(object):
def process_request(self,req):
if 'vid' in req.COOKIES:
return None
else:
return HttpResponseRedirect('/freshman/')
开启中间件
在定义中间件之后,还要在全局配置中向MIDDLEWARE_CLASSES元组添加这个 类的全名。假设我们使用模块文件ezmw.py保存这个类:
settings.MIDDLEWARE_CLASSES = ('ezmw.FreshmanMiddleware',)
运行示例代码,理解为什么要引入中间件的概念。