schedule2019-05-10

Python3 + Jinja2で変数の引き渡し

Jinja

JinjaはPythonで利用できるテンプレートエンジンです。 マイクロWEBフレームワークのFlaskでも採用されています。

公式ドキュメントのサンプルはほぼPython2で書かれているため、 Python3でJinja2を利用してみます。

今回は、Python3 + Jinja2単体で変数を渡しす簡単なテキストの作成をしてみます。 Jinja2はPython3.3以上に対応しています。

Jinja2

先にテンプレートの書き方を説明します。

変数を文字にして埋め込む際には'{{ 変数名 }}'とします。

user = 'suzu6'は以下のようにすると<p>suzu6</p>となります。 {# #}はコメント。

<p>{{ user }}</p> {# <p>suzu6</p> #}

配列の場合

users = ['suzu6', 'suzu7', 'suzu8']

<p>{{ user[2] }}</p> {# <p>suzu8</p> #}

また、for文もこのように書けます。

{% for user in users %}
  <p>{{ user }}</p>
{% endfor %}
<p>suzu6</p>
<p>suzu7</p>
<p>suzu8</p>

辞書型の場合

users = {'name': 'suzu6', 'id':28}

<select>
  <option value="{{ user['id'] }}">{{ user['name'] }}</option>
</select>

" "で囲んだ場合は中身をダブルクォーテーションにしないように注意。

user['name']の表記だけでなく、オブジェクトっぽくドットでキーを指定できる。

<select>
  <option value="{{ user.id }}">{{ user.name }}</option>
</select>

Python3でのサンプル

pipでのインストールコマンド

pip install Jinja2

文字列に対する変換

テキストに対して文字列を埋め込んでみます。

from jinja2 import Template

template = Template('Hello {{ user }}!')
dst = template.render(user='suzu6')

print(dst)
# Hello suzu6!

jinja2.Templateを使って引き渡した文字列を変換できます。 template.render()には、テンプレート内の変数名に対して値を渡します。

複数の変数

引数を増やして複数の変数を渡します。 変数名が被らないようにしてください。

from jinja2 import Template

template = Template('Hello {{ name }}! It is {{ weather }} today.')
dst = template.render(name='suzu6', weather='fine')

print(dst)
# Hello suzu6! It is fine today.

辞書型・配列

辞書型と配列型も同様です。

param = {
    'name': 'suzu6',
    'age': 28
}

template = Template('{{ param.name }} is {{ param.age }} years old.')
dst = template.render(param=param)

print(dst)
# suzu6 is 28 years old.

template = Template('{{ param["name"] }} is {{ param["age"] }} years old.')
dst = template.render(param=param)

print(dst)
# suzu6 is 28 years old.