【发布时间】:2019-02-06 20:57:41
【问题描述】:
我正在制作一个 Flask 应用程序。在某些视图中,我需要使用 LaTeX 模板而不是 HTML。
是否可以创建另一个 Jinja2 环境并使用 render_template 函数选择要使用的环境?
我正在使用蓝图,我想以与使用主 Jinja 环境相同的方式分配模板文件夹。
【问题讨论】:
我正在制作一个 Flask 应用程序。在某些视图中,我需要使用 LaTeX 模板而不是 HTML。
是否可以创建另一个 Jinja2 环境并使用 render_template 函数选择要使用的环境?
我正在使用蓝图,我想以与使用主 Jinja 环境相同的方式分配模板文件夹。
【问题讨论】:
您可以使用 Jinja 的 Environment.overlay 方法复制 Flask 的环境设置,然后插入您自己的模板加载器以查找特定于给定蓝图的模板(即使它们在应用程序的其他地方共享模板的名称)。
from jinja import ChoiceLoader
new_loader = ...
existing_loader = app.jinja_env.loader
new_environment = app.jinja_env.overlay(
loader=ChoiceLoader([new_loader, existing_loader]),
autoescape=select_autoescape(['html', 'xml'])
)
在这里,我定义了一个新的模板加载器,并将其插入到 Jinja 查找顺序的前面。这将保留 Flask 环境设置的所有其余部分,包括 request 和 app 等变量。
或者,您可以包装 Flask 的 render_template() 函数并执行相同的操作。我已经看到这两种方法都成功地部署在了生产环境中。
【讨论】: