在Python中读取Jinja文件

时间:2019-01-14 06:36:18

标签: python jinja2

我必须读取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

2 个答案:

答案 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"])