Jinja1
Jinja2 与 Jinja1 在 API 使用和模板语法上最为兼容。下面的列表解释了 Jinja1 和Jinja2 的区别。
API
- 加载器
- Jinja2 使用不同的加载器 API 。因为模板的内部表示更改,不再支持 memcached这样的外部缓存系统。模板的内存开销与常规的 Python 模块相当,外部缓存不能带来优势。如果你以前使用了一个自定义的加载器,请阅读loader API 部分。
- 从字符串加载模板
- 在过去,在默认环境配置中使用 jinja.from_string 从字符串生成模板是可能的。 Jinja2 提供了一个 Template 类来用于做同样的事情,但是需要可选的额外配置。
- 自动 Unicode 转换
- Jinja1 执行把字节串从一个给定编码到 unicode 对象的自动转换。这个转换不再被实现,因为它与大多数使用常规 Python ASCII 字节串到 Unicode 转换的库不一致。一个由 Jinja2 驱动的应用 必须 在内部的每个地方都使用 unicode 或确保 Jinja2 只会被传递 unicode 字符串。
- i18n
- Jinja1 使用自定义的国际化翻译器。 i18n 现在作为 Jinja2 的一个扩展,并且使用更简单、更 gettext 友好的接口,并且支持 babel 。更多细节见i18n 扩展 。
- 内部方法
- Jinja1 在环境对象上暴露了诸如 call_function 、 get_attribute 等内部方法。当它们被标记为一个内部方法,则可以覆盖它们。 Jinja2 并没有等价的方法。
- 沙箱
- Jinja1 默认运行沙箱模式。实际上只有少数应用使用这一特性,所以这在Jinja2 中是可选的。更多关于上下执行的细节见SandboxedEnvironment 。
- 上下文
- Jinja1 有一个上下文栈存储传递到环境的变量。在 Jinja2 中有一个类似的对象,但它不允许修改也不是单例的。由于继承是动态的,现在当模板求值时可能存在多个上下文对象。
- 过滤器和测试
- 过滤器和测试现在是常规的函数。不再允许使用工厂函数,且也没有必要。
模板
Jinja2 与 Jinja1 的语法几乎相同。区别是,现在宏需要用小括号包裹参数。
此外, Jinja2 允许动态继承和动态包含。老的辅助函数 rendertemplate 作古,而使用 include 。包含不再导入宏和变量声明,因为采用了新的 import 标签。这个概念在 导入 文档中做了解释。
另一个改变发生在 for 标签里。特殊的循环变量不再拥有 parent 属性,而你需要自己给循环起别名。见 访问父级循环 了解更多细节。