Читать файл Jinja в Python - PullRequest
0 голосов
/ 14 января 2019

Мне нужно прочитать 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 голосов
/ 18 января 2019

Я пытался, и это сработало:

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"])
0 голосов
/ 14 января 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...