Flask のテンプレートエンジン Jinja2 の基本

Flask は標準でテンプレートエンジン Jinja2 を採用している。HTML ファイルに Python の変数や制御構文を埋め込むことで、動的なページを生成できる。

テンプレートの基本

テンプレートファイルは templates ディレクトリに配置する。render_template 関数でテンプレートを呼び出し、変数を渡す。

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/hello/<name>')
def hello(name):
    return render_template('hello.html', name=name)

テンプレート側では {{ }} で変数を展開する。

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

制御構文

Jinja2 では {% %} で制御構文を記述する。

{% if user %}
    <p>Welcome, {{ user.name }}!</p>
{% else %}
    <p>Please log in.</p>
{% endif %}

<ul>
{% for item in items %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

iffor は必ず endifendfor で閉じる必要がある。

テンプレートの継承

共通レイアウトを親テンプレートとして定義し、子テンプレートで継承できる。

<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>
<!-- hello.html -->
{% extends "base.html" %}

{% block title %}Hello{% endblock %}

{% block content %}
<h1>Hello, {{ name }}!</h1>
{% endblock %}

{% block %} で定義した領域を子テンプレートで上書きする仕組みである。