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 属性,而 你需要自己给循环起别名。见 访问父级循环 了解更多细节。
更多建议: