如何直接从文件系统加载jinja模板

时间:2016-07-28 16:59:42

标签: python templates jinja2

我对python缺乏经验,所以当我阅读jinja API document at pocoo.org时,我误入歧途。它写着:

配置Jinja2为应用程序加载模板的最简单方法大致如下:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
这将创建一个模板环境,其中包含默认设置和一个加载器,用于在 yourapplication python包中的 templates 文件夹中查找模板。

事实证明,这并不是那么简单,因为你必须在其中制作/安装包含模板的python包,这会带来许多不必要的复杂性,特别是如果你无意分发你的代码。您可以参考有关herehere主题的SO问题,但答案含糊不清且不满意。

显然,天真的新手想要做的只是直接从文件系统加载模板,而不是作为包中的资源。 这是怎么做的?

4 个答案:

答案 0 :(得分:48)

以下:使用FileSystemLoader代替PackageLoader。我在网络herehere上找到了示例。让我们假设您在模板的同一个目录中有一个python文件:

./index.py
./template.html

此index.py将找到模板并呈现它:

#!/usr/bin/python
import jinja2

templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "template.html"
template = templateEnv.get_template(TEMPLATE_FILE)
outputText = template.render()  # this is where to put args to the template renderer

print(outputText)

事实证明,jinja2 API文档确实有一个section which discusses all the built-in loaders,所以不要马上注意到这一点,这有点令人尴尬。但引言的措辞是PackageLoader似乎是默认的,"最简单的"方法。对于蟒蛇的新手来说,这可能导致一场疯狂的追逐。

答案 1 :(得分:41)

更简单的方法是直接调用jinj2.Template构造函数并使用 gridPane.getChildren().forEach(item -> { item.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (event.getClickCount() == 1) { javafx.scene.Node source = (javafx.scene.Node)event.getSource() ; Integer colIndex = GridPane.getColumnIndex(source); Integer rowIndex = GridPane.getRowIndex(source); System.out.println("ColIndex: " + colIndex + ", RowIndex: " + rowIndex); } } }); }); 加载文件:

open

答案 2 :(得分:4)

如果使用Python 3.4+和Jinja2-v2.11 +,我们可以结合使用python的pathlib和Filesystem来简化流程

from pathlib import Path
...

p = Path(__file__).parent.parent / 'templates' # sample relative path
env = Environment(
    loader=FileSystemLoader(Path(p)))
template = env.get_template('your_file.jinja2')

我不满意直接使用Template(file),因为Jinja的模板继承处理可能无法正常工作。

仅在Jinja的最新版本-v2.11 +中添加了对路径库的支持

答案 3 :(得分:0)

这是一支班轮:

template = Template(open('template_file.j2').read())

然后,您可以在另一行或一行中全部渲染模板:

rendered = Template(open('template_file.j2').read()).render(var="TEXT")