1. Jinja2とは何か?
Jinja2はPythonで書かれた強力なテンプレートエンジンです。HTMLやその他のテキストファイルに動的なコンテンツを簡単に組み込むことができます。
メリット: HTMLとPythonのロジックを分離できるため、メンテナンスが容易になります。これはMVCパターン(Model-View-Controller)の「View」部分に相当します。
2. 基本的な構文
2.1 変数の表示
Pythonコード:
template = Template(“<p>こんにちは、{{ name }}さん!</p>”)
result = template.render(name=”田中”)
結果:
2.2 制御構文
条件分岐 (if-else)
条件が真の場合の内容
{% else %}
条件が偽の場合の内容
{% endif %}
<p>ようこそ、{{ username }}さん!</p>
{% else %}
<p>ログインしてください</p>
{% endif %}
ループ (for)
繰り返し処理する内容
{% endfor %}
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
Pythonコード:
template = Template(“<ul>{% for item in items %}<li>{{ item }}</li>{% endfor %}</ul>”)
result = template.render(items=[“りんご”, “バナナ”, “オレンジ”])
結果:
<li>りんご</li>
<li>バナナ</li>
<li>オレンジ</li>
</ul>
3. フィルタの使用
フィルタを使用して変数の値を変換できます。
フィルタ | 説明 | 例 |
---|---|---|
upper | 大文字に変換 | {{ name|upper }} |
lower | 小文字に変換 | {{ name|lower }} |
capitalize | 先頭を大文字に | {{ name|capitalize }} |
default | デフォルト値を設定 | {{ name|default(‘ゲスト’) }} |
length | 長さを取得 | {{ items|length }} |
trim | 前後の空白を削除 | {{ text|trim }} |
join | リストを結合 | {{ list|join(‘, ‘) }} |
<p>アイテム数: {{ items|length }}</p>
<p>買い物リスト: {{ items|join(‘, ‘) }}</p>
結果:
<p>アイテム数: 3</p>
<p>買い物リスト: りんご, バナナ, オレンジ</p>
4. マクロの使用
マクロは関数のように再利用可能なコードブロックを定義できます。
マクロの内容
{% endmacro %}
<input type=”{{ type }}” name=”{{ name }}” value=”{{ value }}”>
{% endmacro %}
<form>
{{ input_field(‘username’) }}
{{ input_field(‘password’, type=’password’) }}
{{ input_field(‘submit’, ‘ログイン’, ‘submit’) }}
</form>
結果:
<input type=”text” name=”username” value=””>
<input type=”password” name=”password” value=””>
<input type=”submit” name=”submit” value=”ログイン”>
</form>
5. テンプレートの継承(レイアウト)
テンプレートの継承を使用して、サイト全体のレイアウトを管理できます。
5.1 ベーステンプレート (base.html)
<html>
<head>
<title>{% block title %}デフォルトタイトル{% endblock %}</title>
</head>
<body>
<header>
{% block header %}デフォルトヘッダー{% endblock %}
</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>
{% block footer %}© 2025 My Website{% endblock %}
</footer>
</body>
</html>
5.2 子テンプレート (page.html)
{% block title %}ホームページ{% endblock %}
{% block header %}
<h1>ようこそ!</h1>
{% endblock %}
{% block content %}
<p>これはコンテンツエリアです。</p>
{% endblock %}
ポイント: {% block %} で定義された部分だけを子テンプレートで上書きできます。残りの部分はベーステンプレートのまま維持されます。
6. テンプレートのインクルード
他のテンプレートファイルを現在のテンプレートに含めることができます。
<html>
<body>
{% include ‘header.html’ %}
<main>
メインコンテンツ
</main>
{% include ‘footer.html’ %}
</body>
</html>
違い: {% include %} はテンプレートをそのまま挿入するだけですが、{% extends %} はレイアウトを継承してブロックを上書きします。
7. コメント
テンプレート内にコメントを追加できます。これはHTMLには出力されません。
8. Flaskとの連携例
PythonのWebフレームワークFlaskとの連携例です。
Pythonコード (app.py):
app = Flask(__name__)
@app.route(‘/’)
def index():
users = [
{‘name’: ‘田中’, ‘age’: 28},
{‘name’: ‘鈴木’, ‘age’: 32},
{‘name’: ‘佐藤’, ‘age’: 25}
]
return render_template(‘index.html’, title=’ユーザー一覧’, users=users)
if __name__ == ‘__main__’:
app.run(debug=True)
テンプレート (index.html):
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<table>
<tr>
<th>名前</th>
<th>年齢</th>
</tr>
{% for user in users %}
<tr>
<td>{{ user.name }}</td>
<td>{{ user.age }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
9. 安全なHTMLエスケープ
Jinja2は自動的にHTML特殊文字をエスケープして、XSS(クロスサイトスクリプティング)攻撃を防ぎます。
Pythonコード:
template.render(text=unsafe_text)
テンプレート:
結果 (自動的にエスケープされる):
エスケープを無効にする場合:
※ |safe フィルタは信頼できるコンテンツのみに使用してください
10. まとめ
- Jinja2はPythonのテンプレートエンジンで、HTMLとPythonのロジックを分離できます
- 基本構文:{{ }} で変数を表示、{% %} で制御構文を記述
- フィルタを使って変数を加工(大文字変換、結合など)
- マクロで再利用可能なコードブロックを定義
- テンプレートの継承で効率的なレイアウト管理
- 自動HTMLエスケープでセキュリティも確保
活用場面: Flask、Django、Pyramidなどの多くのPythonフレームワークと連携して使われています。Webサイト制作だけでなく、メール本文の生成やレポート作成などにも活用できます。