为什么jinja2 Loop没有输出?

Why is there no output in jinja2 Loop?

我尝试在我的神社模板中循环一个 dic。但是我总是没有输出。

dic={"SERVICE1" : "tess","SERVICE2" : "test"}

with open(Path(Path.cwd()/"test.jinja")) as f:
template = Template(f.read()).render(data_nebula_docker)
print(template)

我的模板是这样的:

{% for item in dic %}
{{item}}
{% endfor %}

普通变量工作正常。我有一些基本的误解吗? 感谢您的帮助!

您的代码有几个问题。我假设您的 with 语句中的缩进问题只是一个 copy-and-paste 错误,并且您的代码实际上看起来像:

with open(Path(Path.cwd()/"test.jinja")) as f:
    template = Template(f.read()).render(data_nebula_docker)
    print(template)

在您的模板中,您引用了一个变量 dic,但您没有将其传递给 render 方法。你想要:

from jinja2 import Template
from pathlib import Path

dic = {"SERVICE1": "tess", "SERVICE2": "test"}

with open(Path(Path.cwd() / "test.jinja")) as f:
    template = Template(f.read()).render(dic=dic)
    print(template)

产生:


SERVICE1

SERVICE2


您会注意到这只会打印出字典中的键。当您遍历字典时(在 Jinja 或 Python 中),您会得到一个键列表。如果您想要 (key, value) 元组,请使用 .items() 方法:

{% for item in dic.items() %}
{{item}}
{% endfor %}

产生:


('SERVICE1', 'tess')

('SERVICE2', 'test')



另外,您对 pathlib.Path 的使用有点费解;你可以这样写:

with (Path.cwd()/"test.jinja").open() as f:

在上面:

  • 没有必要将 Path() / "string" 的结果包装在对 Path() 的调用中(因为它已经是 Path
  • 一个 Path 对象有一个 open 方法,所以我们可以在 Path.cwd()/"test.jinja".[=52= 产生的 Path 上调用 .open() ]

虽然在这种情况下,您的基于 pathlib 的代码并不能赢得胜利:

with open("test.jinja") as f: