jinja2のいろはのい

はじめに

仕事でjinja2に触れる機会に恵まれた。名前が印象的ですね、神社ですって。前にどこかで聞いたことがあって、気になってたので今回触れられて良かった〜〜

Welcome | Jinja2 (The Python Template Engine)

Jinja2とは

Jinja2はモダンでデザイナーフレンドリーなPython用のテンプレート言語です。Djangoのテンプレートを模してあります。高速で幅広く活用でき、サンドボックスのテンプレート実行環境を使うことでセキュアにも利用できます。

Jinja2の公式ページから抜粋。

わかったこと

たしかにDjangoのテンプレートとめっちゃ似てる!という第一印象。というか、むしろテンプレの書き方はDjangoと何が違うのかわからない。Djangoを先に触っていたので、すんなりテンプレは書けた。公式に載ってるサンプルコードはこんな感じ。

<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>

Djangoですね。

基本的な使い方

インストール

インストールはpipでサクッとできます。ありがとうpipを作ったひと。

pip install Jinja2

重要なオブジェクト

Jinja2はtemplate Enviroment と呼ばれるオブジェクトを使って利用します。その名の通り、このクラスのインスタンスは設定を保存したり、ファイルシステムからテンプレートを読み込んだりするJinjaの中心的役割を果たします。そしてそういう役割のオブジェクトをCenteral Objectと呼ぶらしい。初耳だ。でも、なんか意味は雰囲気理解。また、もし必要とあらば Enviroment インスタンスを複数生成していくつかの環境を整えることも可能とのこと。いろいろ柔軟な使い方ができそうな気もするが、その具体的な状況が浮かばない。。。

Enviroment の設定

このコードは公式のドキュメントから引っ張ってきた、最もシンプルな環境設定例。

from jinja2 import Environment, PackageLoader, select_autoescape
env = Environment(
    loader=PackageLoader('yourapplication', 'templates'),
    autoescape=select_autoescape(['html', 'xml'])
)

loader でテンプレートの参照先を指定している。ここでは./yourapplication/templates 内をテンプレートフォルダとして参照している。ほかのloader を使ったり、自分で書くこともできるらしく、そうすることでデータベースやほかのリソースからもテンプレートを引っ張ってくることが可能だそうだ。便利そう。

テンプレートを読み込もう!

get_template() で指定したテンプレートフォルダからテンプレートを取得することができる。

template = env.get_template('mytemplate.html')

たったのこれだけ。激楽。

ついにレンダリング

レンダリングにはrender() を使います。

print template.render(the='variables', go='here')

これでレンダリングされます。ありがとうございます。コードを見れば明白ですが、カッコ内にキーワード引数の要領で引数を設定すれば、テンプレート内で変数を参照することができます。いいね。

おわりに

テンプレートってなんだかワクワクしますよね。Pythonで扱ってた変数をHTMLに組み込めるっていうだけで、やれることが一気に広がって。夢が広がりまくります。僕がはじめてRailsでテンプレートを使ったときのワクワクが蘇りました。「俺は……とんでもない力を手に入れた……これでなんでもできる……」と当時は思いましたね。

+α 今日知ったこと

  • su はスイッチユーザの略。勝手にスーパユーザの略と思ってて、びびった
  • bashcat (which python) ってこういうカッコの使い方ができるのを知らなかった

毎日が発見です。

VSCodeのターミナルがぶっ壊れ気味なので直したい。前触れもなくフリーズして死ぬ。今日はほんとスペランカーなみに雑魚だった。ステージング環境でテスト中に死ななくてよかった。