jinja2.exceptions.UndefinedError 与 Python 字典
jinja2.exceptions.UndefinedError with Python dict
我正在尝试根据从 CSV 文件创建的 python 字典呈现 jinja2 模板,但 jinja2 对该字典不理解,我不明白为什么。
这是模板:
{% for key, value in hostname.iteritems() %}
interface {{ key }}
description {{ value }}
{% endfor %}
这是 python 代码:
import csv
from pprint import pprint
import os
import jinja2
CSVDATA_FILENAME = 'port_descriptions.csv'
TEMPLATE_FILENAME = 'cisco.j2'
hostnames = []
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.getcwd()),
trim_blocks=True, lstrip_blocks=True)
template = env.get_template(TEMPLATE_FILENAME)
for row in csv.DictReader(open(CSVDATA_FILENAME)):
if row['hostname'] not in hostnames:
hostnames.append(row['hostname'])
for hostname in hostnames:
x = hostname
hostname = {}
for row in csv.DictReader(open(CSVDATA_FILENAME)):
if x == row['hostname']:
hostname[row['port']] = row['des']
pprint(hostname)
print template.render(hostname)
在倒数第二行 (pprint(hostname))
代码将根据需要打印主机名字典,所以我知道它们在那里,但 jinja2 不会呈现它们。我是否遗漏了一些明显的东西,也许在模板中?
据我所知,我的代码遵循这个 - http://keepingitclassless.net/2014/03/network-config-templates-jinja2/ 非常接近,但我一定是忽略了什么?
查看文档中的 this example,您可能需要将字典作为命名关键字参数传递,如下所示:print template.render(hostname=hostname)
注意只有等号左边的部分与模板相关;你可以只做 template.render(hostname={'testy': 'testy'})
并且相同的模板将继续工作。
我正在尝试根据从 CSV 文件创建的 python 字典呈现 jinja2 模板,但 jinja2 对该字典不理解,我不明白为什么。
这是模板:
{% for key, value in hostname.iteritems() %}
interface {{ key }}
description {{ value }}
{% endfor %}
这是 python 代码:
import csv
from pprint import pprint
import os
import jinja2
CSVDATA_FILENAME = 'port_descriptions.csv'
TEMPLATE_FILENAME = 'cisco.j2'
hostnames = []
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.getcwd()),
trim_blocks=True, lstrip_blocks=True)
template = env.get_template(TEMPLATE_FILENAME)
for row in csv.DictReader(open(CSVDATA_FILENAME)):
if row['hostname'] not in hostnames:
hostnames.append(row['hostname'])
for hostname in hostnames:
x = hostname
hostname = {}
for row in csv.DictReader(open(CSVDATA_FILENAME)):
if x == row['hostname']:
hostname[row['port']] = row['des']
pprint(hostname)
print template.render(hostname)
在倒数第二行 (pprint(hostname))
代码将根据需要打印主机名字典,所以我知道它们在那里,但 jinja2 不会呈现它们。我是否遗漏了一些明显的东西,也许在模板中?
据我所知,我的代码遵循这个 - http://keepingitclassless.net/2014/03/network-config-templates-jinja2/ 非常接近,但我一定是忽略了什么?
查看文档中的 this example,您可能需要将字典作为命名关键字参数传递,如下所示:print template.render(hostname=hostname)
注意只有等号左边的部分与模板相关;你可以只做 template.render(hostname={'testy': 'testy'})
并且相同的模板将继续工作。