はてだBlog(仮称)

私的なブログど真ん中のつもりでしたが、気づけばWebサイト系のアプリケーション開発周りで感じたこと寄りの自分メモなどをつれづれ述べています。2020年6月現在、Elasticsearch、pandas、CMSなどに関する話題が多めです。...ですが、だんだんとより私的なプログラムのスニペット置き場になりつつあります。ブログで述べている内容は所属組織で販売している製品などに関するものではなく、また所属する組織の見解を代表するものではありません。

Jinja(Jinja2)をさわってみる

Jinja(Jinja2)

JinjaはPythonで動作するテンプレートエンジンです。

PythonのWAFのFlaskのデフォルトのテンプレートエンジンでもあるようです。

WAFとの結びつきが強いイメージなのでWebアプリでしか動作しないのかなと思っていたら、コマンドラインPythonでも動作してよしなに文字列を吐き出してくれるようなので、私のような小手先作業ヤローにはもってこいということで勉強してみました。*1

事例

公式サイトへのリンク

jinja.palletsprojects.com

勉強の内容

手元の環境では、

pip install jinja2

で特に苦労もなくインストールできました。

また、実際の使いっぷり(シンタックス習熟)ですが、公式やjinja2でググってまとめていただいているサイトを拝見すれば、また、この類のテンプレートエンジンを利用して勘所が分かっていれば、見よう見まねで慣れることができそうです。

...ということで、実際は解説をするまでもなく、ひとまずこれで、おおよそ基本的なところが分かる・感じられるという程度の事例のファイルを以下にペタペタ貼っておきます。

事例資材の一覧

◆jinja2tmpl/q.tmpl

{# 公式R  https://jinja.palletsprojects.com/en/2.10.x/ #}

{# コメント #}
{% include "header.tmpl" %}
{# ↑インクルード。 なお、ここでは省略するがblock/extendを使うと、親のテンプレートに、子側から子のコンテンツを差し込みすることができる。つまるところ「継承」ですね。 #}

{% set myvar = "テンプレート内の変数" %}
{% set condvar = 3 %}
{{myvar}}
<!-- ↓ if など制御構造 -->
{% if category %}
     {% for i in items %}
        {{category}}--{{i.no}}
     {% endfor %}
{% elif condvar >2 %}     
     エルイフの場合、ここがレンダリング
{% else %}
     エルスの場合、ここがレンダリング
{% endif %}
<!--  if ブロックここまで -->

{# マクロの定義 #}
{% macro myfunc(arg) %}
  {{arg}}
{% endmacro %}

{# マクロの実行 #}
{{myfunc(myvar)}}

{# ここでは省略するが、マクロでcallブロック(caller)を使うと実行側(呼び出し側)から、挙動を制御できる。高階関数みたいな感じ。#}

{#
その他キーワード
・trim_blocks
・エスケープ
・サニタイズ(escapeフィルタ)
・その他の「フィルタ」の活用
・マクロを部品化
・ネストされたインプットデータを再帰的に処理させる場合、「loop」を使うと良い
#}

◆jinja2tmpl/header.tmpl

<div>
ヘッダー
{{category}}
</div>

◆ jinja2sample.py

from jinja2 import Template,Environment,FileSystemLoader

data = {'category':'カテゴリ','items':[{'no':1},{'no':2},{'no':3}]}
env = Environment(loader=FileSystemLoader('jinja2tmpl/'))
print(
    env.get_template('q.tmpl').render(data)
)    

# もっと簡単な例
print(
    Template('''
    {{aaa}}
    ''' ).render({'aaa': '中身'})
)

実行

python jinja2sample.py

などで実行

標準出力への出力イメージ


<div>
ヘッダー
カテゴリ
</div>




テンプレート内の変数
<!-- ↓ if など制御構造 -->

     
        カテゴリ--1
     
        カテゴリ--2
     
        カテゴリ--3
     

<!--  if ブロックここまで -->






  テンプレート内の変数




    中身

以上でした。

*1:ちなみに、私自身は、多くの言語で動作するという点で、mustacheがお好みなのですが、Jinjaはもう一声便利な仕組みをもちつつ、その割にシンプルでしたので、満足しています。それはそうと、Jinjaに限らず、Thymeleafのようにブラウザでローカルファイルとして開いてそれとなくデザインが確認できるテンプレートエンジンは他にはないんだろうか。