Jinjaのテンプレートで使用する変数プレースホルダーを変更する

こんにちは。サービスグループの武田です。PythonのテンプレートエンジンJinjaで使用する変数プレースホルダーの記号を変更してみました。
2020.08.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

JinjaというPythonのデファクトともい言えるテンプレートエンジンがあります。

さてこのJinjaですが、テンプレートエンジンというくらいですので、変数の埋め込みや制御構文が使用できます。

変数の埋め込み。

Hello, {{ name }}

if文の使用。

{% if cond %}
  Hi
{% endif %}

Jinjaを使用する上でこの仕様はまったく困らないのですが、何らかの理由でプレースホルダーに使用する記号を変えたくなることもきっとあるでしょう。というわけでやってみました。

環境

$ pipenv --version
pipenv, version 2020.6.2

$ python3 -V
Python 3.8.3

またJinjaのバージョンは2.11.2です。

やってみた

まずは適当なディレクトリを作成して環境を用意します。

$ mkdir /path/to/jinja2-test && cd $_
$ pipenv install
$ pipenv install jinja2

簡単なスクリプトを用意します。

main.py

from jinja2 import Environment

env = Environment()

text = "Hello, {{ name }}"

tpl = env.from_string(text)

msg = tpl.render({"name": "Classmethod"})

print(msg)

実行してみます。

$ pipenv run python main.py
Hello, Classmethod

問題なさそうですね。それではプレースホルダーをデフォルトの{{ foo }}形式から${ foo }形式に変えてみましょう。

main.py

from jinja2 import Environment

env = Environment(variable_start_string="${", variable_end_string="}")

text = "Hello, ${ name }"

tpl = env.from_string(text)

msg = tpl.render({"name": "Classmethod"})

print(msg)

ポイントはEnvironment()の引数に指定しているvariable_start_stringvariable_end_stringです。これらを指定することで変数プレースホルダーの記号を任意のものに変更できます。なお、ブロックやコメントの記号も変更可能です。

実行してみます。

$ pipenv run python main.py
Hello, Classmethod

うまく動きました!

まとめ

簡単ですがプレースホルダーの変更を試してみました。既存のシステムからの移行で、どうしてもテンプレート内の記号が変えられない場合などに思い出してあげてください。

参考情報