我必须读取Jinja
文件,并且必须从文件中获取特定属性。
考虑以下示例:
我有demo.jinja
个文件,其中包含:
resources:
- name: a-new-network
type: compute.v1.network
properties:
IPv4Range: 10.0.0.1/16
我必须获取type
属性的值,即compute.v1.network
。
我尝试过:
上面的代码视为yaml
。并尝试:
a = """resources:
- name: a-new-network
type: compute.v1.network
properties:
IPv4Range: 10.0.0.1/16"""
print yaml.load(a)
正在打印{'resources': [{'type': 'compute.v1.network', 'name': 'a-new-network', 'properties': {'IPv4Range': '10.0.0.1/16'}}]}
因此,我可以轻松获得type
:["resources"][0]["type"]
对于上面的.jinja
文件,该文件可以正常工作。
我也有另一种Jinja格式,其中包含类似代码的{% --- %}
。
{% for i in range(properties['readReplicas']) %}
- name: {{ ID }}-rr-{{ i }}
type: sqladmin.v1beta4.instance
properties:
backendType: SECOND_GEN
instanceType: READ_REPLICA_INSTANCE
databaseVersion: {{ properties['cloudsql']['databaseVersion'] }}
region: {{ properties['cloudsql']['region'] }}
masterInstanceName: $(ref.{{ ID }}-master.name)
replicaConfiguration:
failoverTarget: false
settings:
tier: {{ properties['cloudsql']['tier'] }}
{% if properties['failover'] %}
metadata:
dependsOn:
- {{ ID }}-failover
{% endif %}
{% endfor %}
在这种情况下,如何获得type
的值,即sqladmin.v1beta4.instance
?因为对于以上jinja
的内容,我不能认为它是yaml
。
答案 0 :(得分:1)
Jinja是一种模板语言,因此您可以通过向其提供数据来消除其变量。要馈送的数据视情况而定。在您的示例中,渲染后文件格式为yaml。因此,您可以像这样制作数据文件demo.yaml
:
{
"properties": {
"readReplicas": 1,
"cloudsql": {
"databaseVersion": 0,
"region": 0,
"tier": 0,
"failover": 0
}
},
"ID": 0
}
然后使用数据文件渲染模板,例如,使用jinja-cli:
jinja -d demo.yaml -f yaml demo.jinja | python3 -c "import sys,yaml;print(yaml.load(sys.stdin.read())[0]['type']);"
输出:
sqladmin.v1beta4.instance
答案 1 :(得分:0)
我尝试过并且奏效了
from jinja2 import Environment, FileSystemLoader
import yaml
config_src = yaml.load(open("./demo1.yaml"))
config_data = config_src["resources"][0]
env = Environment(loader = FileSystemLoader("./"), trim_blocks=True, lstrip_blocks=True)
template = env.get_template("./demo1.jinja")
data = template.render(config_data)
sdata = yaml.load(data)
print(sdata["resources"][0]["type"])