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