我对python缺乏经验,所以当我阅读jinja API document at pocoo.org时,我误入歧途。它写着:
配置Jinja2为应用程序加载模板的最简单方法大致如下:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
这将创建一个模板环境,其中包含默认设置和一个加载器,用于在 yourapplication python包中的 templates 文件夹中查找模板。
事实证明,这并不是那么简单,因为你必须在其中制作/安装包含模板的python包,这会带来许多不必要的复杂性,特别是如果你无意分发你的代码。您可以参考有关here和here主题的SO问题,但答案含糊不清且不满意。
显然,天真的新手想要做的只是直接从文件系统加载模板,而不是作为包中的资源。 这是怎么做的?
答案 0 :(得分:48)
以下:使用FileSystemLoader
代替PackageLoader
。我在网络here和here上找到了示例。让我们假设您在模板的同一个目录中有一个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")