首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在jinja2模板中使用set命令替换变量时出现问题

在jinja2模板中使用set命令替换变量时出现问题
EN

Stack Overflow用户
提问于 2019-01-22 19:53:46
回答 1查看 762关注 0票数 0

我有一个YAML文件,它有两个字典的默认值,定义如下:

代码语言:javascript
复制
sample:
  high:
    name: high-volume
    alias: hi-vl

hi-vl:
  ab1:    
    add:
      range: 0
      range1: 0
    remove:
      range: -1
      range1: -1

为了迭代并从jinja2模板中获取值,我使用以下代码:

代码语言:javascript
复制
{% for key, value in sample.iteritems() %}
{% set al = value.alias %}
{% for key1, value1 in al.iteritems()  %}

当我执行这个模板来生成YAML文件时,我得到了错误:

代码语言:javascript
复制
"msg": "AnsibleUndefinedVariable: 'unicode object' has no attribute 'iteritems'"}

set变量正在将变量更改为unicode。如果我在set语句中用直接的value代替value.alias,那么迭代就能正常工作。

我试过使用像to_yamltojson这样的过滤器,但它们会转换成字符串,而不是呈现为dict。

EN

回答 1

Stack Overflow用户

发布于 2019-02-02 04:09:30

您可以使用Python将yaml转换为dict,创建jinja字符串,将jinja字符串加载到Template类中并呈现它:

假设yaml存储在一个名为specs.yaml的文件中。我们将首先打开它并将其转换为字典:

代码语言:javascript
复制
import yaml
import json
from jinja2 import Template

with open('specs.yaml') as f:
  specs = f.read()
  specs_dict = yaml.load(specs) #get dict from yaml

print(json.dumps(test, indent=4)) #print pretty dict tree
#Output:

{
"sample": {
    "high": {
        "name": "high-volume",
        "alias": "hi-vl"
    }
},
"hi-vl": {
    "ab1": {
        "add": {
            "range": 0,
            "range1": 0
        },
        "remove": {
            "range": -1,
            "range1": -1
        }
    }
}
}

现在,我们可以定义jinja字符串并创建一个模板对象来呈现它。

代码语言:javascript
复制
#form jinja string
jinja_string = """{% for key, value in specs_dict['sample'].items() %}                              
{% set al = value['alias'] %}
{% for key, value in specs_dict[al].items() %}
{{key}}:{{value}}
{% endfor %}                        
{% endfor %}"""

# create template object and render it
template = Template(jinja_string)
print(template.render(specs_dict=specs_dict))
#Output:
ab1:{'add': {'range': 0, 'range1': 0}, 'remove': {'range': -1, 'range1':-1}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54307764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档