常见问题

为什么它被称为 Jinja?

“Jinja” 是一个日本神道神社或寺庙,寺庙和模板共享类似的英文发音。它不是以乌干达的城市命名。

Jinja 有多快?

Jinja 在模板引擎中相对较快,因为它将模板代码编译并缓存到 Python 代码,因此无需每次都解析和解释模板。渲染模板变得尽可能接近执行 Python 函数。

Jinja 还广泛使用缓存。模板在加载后按名称缓存,因此模板的未来使用避免了加载。模板加载本身使用字节码缓存来避免重复编译。缓存可以对外,以便在重新启动后仍然存在。模板还可以预编译并作为快速的 Python 导入加载。

我们不喜欢基准测试,因为它们不能反映真实使用情况。性能取决于许多因素。不同的引擎有不同的默认配置和权衡,这使得难以明确如何设置有用的比较。通常,数据库访问、API 调用和数据处理对性能的影响比模板引擎大得多。

在模板中放置逻辑难道不是一个坏主意吗?

毫无疑问,您应该尝试尽可能从模板中删除更多逻辑。逻辑越少,模板就越容易理解,潜在副作用越少,编译和渲染也越快。但是,没有逻辑的模板意味着处理必须在渲染之前在代码中完成。一个这样做的模板引擎与 Python 一起提供,称为string.Template,虽然它肯定很快,但它不方便。

Jinja 的块、语句、过滤器和函数调用等特性使其更容易编写富有表现力的模板,几乎没有限制。Jinja 不允许在模板中使用任意 Python 代码,也不允许使用 Python 语言中的所有特性。这使引擎更容易维护,并使模板更具可读性。

模板中需要一些逻辑才能让每个人都满意。模板中的逻辑过多会使其难以推理和维护。由您决定应用程序的工作方式,以及平衡您希望在模板中放置多少逻辑。

为什么 HTML 转义不是默认设置?

Jinja 提供了一项功能,可以启用它来转义已呈现模板中的 HTML 语法。但是,它在默认情况下处于禁用状态。

Jinja 是一个通用模板引擎,它不仅用于 HTML 文档。您可以生成纯文本、LaTeX、电子邮件、CSS、JavaScript、配置文件等。对于所有这些文档类型,HTML 转义都没有意义。

虽然自动转义意味着您不太可能遇到 XSS 问题,但它在编译和呈现期间还需要大量的额外处理,这会降低性能。Jinja 使用 MarkupSafe 进行转义,它提供了经过优化的 C 代码以提高速度,但它仍然会引入开销来跨方法和格式跟踪转义。