flask+jinja2でのjinja2の設定を変更する

flaskjinja2の環境変数というかオプションを指定して、テンプレートの出力の気になる空行を除去する。

環境

  • Flask==2.1.2
  • Jinja2==3.1.2

flask+jinja2のデフォルト設定

Template Designer Documentation — Jinja2 2.8 documentationにてほとんど書いてありますが、特に設定をしないでテンプレートのレンダリングを行うと、{{ }}{% %}などがあった部分がそのまま残ってしまいます。

<div>
    {% if some_flag %}
        フラグがあるよ
    {% endif %}
</div>

テンプレートを上のようにしていると、some_flagTrueのとき、

<div>

        フラグがあるよ

</div>

上のような出力になってしまいます。

<div>
        フラグがあるよ
</div>

せめてこういう感じにしたいと思います。

設定

先のjinja2のドキュメントによれば、trim_blockslstrip_blocksが有効になっていれば、希望の出力が得られるようです。これを有効にします。flaskの下でjinja2のレンダリングを行うので、flask側で設定を行う必要があり、どうするかちょっと手間取ったので記録します。

app = Flask(__name__)
app.jinja_options = {
    'trim_blocks': True,
    'lstrip_blocks': True,
}
# ...

このようにflask.Flask.jinja_optionsを利用します。ドキュメントはこちら: API — Flask Documentation (2.1.x)

この設定のみで、先ほどの希望の出力を得ることができます。

設定しない方法

そもそも{%- expression %}{% expression -%}などのように-をつけておけば、前や後ろの空白は出力しないようにできるようです。最初の例で、

<div>
    {%- if some_flag %}
        フラグがあるよ
    {%- endif %}
</div>

このようにすると希望の出力になるようです。ドキュメントによるとループでは中身を挟むように使うこともあるようです。

こちらは試してないので、推測混じりです。ご了承ください。

おわり

flaskを使っている上でjinja2の設定をどうするかを記録したかったのでとりあえずこんな感じで十分。

他にもjinja2のオプションはあるので、いくつかはそのうち書きたいと思います。

以上です。

コメント

タイトルとURLをコピーしました