Django: 路由与视图 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

中间件

视图函数适合实现业务功能的纵向切割,我们可以将不同的业务逻辑, 分解到不同的视图函数中去实现。

但并不是所有的代码都适合放在视图函数中实现。例如,我们希望通过 检测请求对象是否携带了指定的cookie来判断用户是否为第一次访问,并 将第一次访问的用户重定向到一个新手页面。

显然,在每个视图函数里都去重复这一功能不算一个好的设计。更好的 方案是在请求分发之前,框架提供一个接口以便应用程序注入代码,拦截 请求对象并进行必要的处理。

middleware1

在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',)
运行示例代码,理解为什么要引入中间件的概念。