noharaのブログ

興味のあることについてゆる~く書きます

jinja2で繰り返しのテキストを生成する

flask, ansibleでよくjinja2使っているのですが、単体で使ったことがなかったのでメモ

繰り返しのテキストを生成する2パターンを試した

テンプレートファイルをインポートして表示するパターン

ググったらよく出てくるパターン、説明不要

ソースコード

import jinja2
from jinja2 import Template, Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
tmpl = env.get_template('temp.txt')

weapons = ["スシ", "プラコラ"]
print(tmpl.render(weapons=weapons))

・テンプレートファイル(temp.txt)

{% for w in weapons %}
{
  "type": "message",
  "message": {
    "type": "text",
    "text": "{{ w }}"
  }
},{% endfor %}

・出力

{
  "type": "message",
  "message": {
    "type": "text",
    "text": "スシ" 
  }
},
{
  "type": "message",
  "message": {
    "type": "text",
    "text": "プラコラ"
  }
},

テンプレートをソースコード内で生成する方法

わからなかったので調べた。
jinja2公式によるとfrom_stringというものがあるらしい。

ソースコード

import jinja2
from jinja2 import Template, Environment

temp = """
{% for w in weapons %}
{
  "type": "message",
  "message": {
    "type": "text",
    "text": "{{ w }}"
  }
},{% endfor %}
"""
weapons = ["スシ", "プラコラ"]
tmpl = Environment().from_string(temp)
print(tmpl.render(weapons=weapons))

・出力
1つめのパターンと同じなので省略