2016-04-26 17 views
1

私はjinja2を使ってネストされた辞書をyamlファイルに出力しようとしています。しかし、私はどのように入れ子のdictsにアクセスするか分からない。 データのフラットな辞書で、私は以下を使用できます。jinja 2つのネストされた辞書からyaml

- request: 
     path: {{ path }} 
     headers: 
      origin: 'somedomain.com' 
      user-agent: 'agent' 
      referer: 'some.domain.com' 
      authority: 'somedomain.com' 
     data: 
      {% for key, value in data.items() -%} 
      {{ key }}: '{{ value }}' 
      {%- endfor %} 
     response: 
     content: 
      file: {{ content }} 

しかし、以下のようなネストされたdictを使用すると、どのように出力を下に達成できますか?

{'toplevelkey1': {'nestedkey1': 'value1', 'nestedkey2': 123, 'nestedkey3': '55', 
       'nestedkey4': 1560}, 'toplevelkey34': 'df', 
'toplevelkey2': {'somekey12': 68, 'somekey58': False, 'somekey48': 3, 'somekey38': 'ADF', 
           'somekey39': 'St'}, 'toplevel34': 'T', 
'toplevel8': {'key33': 68, 'key94': 3, 'key83': 'T', 'key84': 'dog'}} 

必要な出力

- request: 
    path: /some/path 
    headers: 
     origin: 'somedomain.com' 
     user-agent: 'agent' 
     referer: 'somedomain.com' 
     authority: 'somedomain.com' 
    data: 
     toplevelkey1: 
     nestedkey1: 'value1' 
     nestedkey2: '123 
     ....  : .... 
     toplevel34: 'T' 
     toplevelkey2: 
     'somekey12': 68 
     .....  : ..... 
    response: 
    content: 
     file: address.json 
+0

あなたは正しく変更されています。ありがとう。 – Yunti

答えて

3

は私がご紹介しますカスタム再帰的な "プリティ・プリント" nestednessの任意のレベルをサポートするフィルタ

def pretty(d, indent=10, result=""): 
    for key, value in d.iteritems(): 
     result += " " * indent + str(key) 
     if isinstance(value, dict): 
      result = pretty(value, indent + 2, result + "\n") 
     else: 
      result += ": " + str(value) + "\n" 
    return result 

env.filters['pretty'] = pretty 

をし、それを使用しますテンプレート:

{{ data|pretty }} 
関連する問題