小学理科718445 views
英語610643 views
Computer366612 views
小学社会309213 views
小学算数1197935 views
高校物理159020 views
いろは2999314 views
高校倫理1436829 views
LaTeX959469 views
高校化学2918073 views

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 %} で定義した領域を子テンプレートで上書きする仕組みである。