【Python】Jinja2 ~ 入門編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/10/18/001757
https://dk521123.hatenablog.com/entry/2023/11/28/235951
https://dk521123.hatenablog.com/entry/2024/09/11/003301
https://dk521123.hatenablog.com/entry/2018/09/22/142348

等で、結構、jinja2について扱ってきたが、
ちゃんと扱っていなかったし、簡単に試せる環境もなかったので、
今回でまとめておく。

目次

【1】jinja2
 1)他ライブラリでの使用例
 2)補足:名前「jinja2(神社2)」の由来
【2】環境設定
 1)前提条件
 2)インストール
【3】サンプル
 例1:Hello world
 例2:別ファイルのテンプレートを取り込む
【4】使用上の注意
 1)リスト内包表記はサポート外

【1】jinja2

* Pythonのテンプレートエンジン

1)他ライブラリでの使用例

* かなりメジャーなライブラリに使われている

[a] Flask

* Webフレームワーク 「Flask(フラスク)」の標準テンプレートエンジンとして使用
 => 以下の関連記事を参照のこと

Flask ~ jinja2 ~
https://dk521123.hatenablog.com/entry/2018/09/22/142348

[b] dbt

* 「dbt (data build tool)」の標準テンプレートエンジンとして使用
 => 以下の関連記事を参照のこと

dbt Macro ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/11/29/003751
dbt ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2024/09/11/003301

2)補足:名前「jinja2(神社2)」の由来

https://jinja.palletsprojects.com/en/3.0.x/faq/#why-is-it-called-jinja

より抜粋
~~~~~~~~~~~
Why is it called Jinja?
The name Jinja was chosen because it’s the name of a Japanese temple
 and temple and template share a similar pronunciation.
It is not named after the city in Uganda.

なぜ「神社」なのか?
Jinjaという名前は、日本のお寺の名前であることから選ばれました。
 寺院(temple)とテンプレート(template)は発音が似ているからです。
ウガンダの都市名にちなんだものではありません。
~~~~~~~~~~~

【2】環境設定

* 以下の公式ドキュメントを参考。

https://jinja.palletsprojects.com/en/3.0.x/intro/#installation

1)前提条件

* Python3.6 以上
* pip

確認例 in Windows

$ python -V
Python 3.12.4

$ pip -V
pip 24.2 from C:\...\pip (python 3.12)

# [pip を更新する場合]
# pip install --upgrade pip

2)インストール

pip install Jinja2

【3】サンプル

例1:Hello world

from jinja2 import Template

template = Template('Hello, {{ name }}!!')
result = template.render(name='Mike')

# Hello, Mike!!
print(result)

例2:別ファイルのテンプレートを取り込む

フォルダ構成

+ demo.py
+ templates
  + hello.tmpl

templates/hello.tmpl

<html>
<title>{{ title }}</title>
<body>
Hello, {{ name }}!!
</body>
</html>

demo.py

from jinja2 import Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('./', encoding='utf8')) 
template = env.get_template('./templates/hello.tmpl')
output_html = template.render(title='Hello world', name='Mike')

# <html>
# <title>Hello world</title>
# <body>
# Hello, Mike!!
# </body>
# </html>
print(output_html)

# ファイル出力させたい場合
with open('output.html', mode='w') as file:
  file.write(str(output_html))

【4】使用上の注意

1)リスト内包表記はサポート外

公式ドキュメント

https://jinja.palletsprojects.com/en/3.0.x/faq/#isn-t-it-a-terrible-idea-to-put-logic-into-templates

より抜粋
~~~~~~
The operators are limited to the most common ones and more advanced expressions
 such as list comprehensions and generator expressions are not supported. 

演算子は最も一般的なものに限られており、
リスト内包やジェネレーター式などの高度な式はサポートされていない。
~~~~~~

cf. list comprehension = リスト内包 (comprehension=理解、包含)

参考文献

https://karupoimou.hatenablog.com/entry/2019/05/20/112231

関連記事

Jinja2 ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2024/10/18/001757
Jinja2 ~ フィルタ ~
https://dk521123.hatenablog.com/entry/2024/10/20/002622
Jinja2 ~ Macro ~
https://dk521123.hatenablog.com/entry/2023/11/28/235951
Jinja2 ~ Whitespace Control ~
https://dk521123.hatenablog.com/entry/2024/10/29/151203
dbt Macro ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/11/29/003751
dbt ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2024/09/11/003301
Flask ~ jinja2 ~
https://dk521123.hatenablog.com/entry/2018/09/22/142348
標準テンプレートエンジン
https://dk521123.hatenablog.com/entry/2020/01/07/212138