高校国語786382 views
教育149096 views
Computer366119 views
高校物理158718 views
高校化学2916128 views
中学社会667518 views
雑学1472959 views
小学算数1197058 views
小学理科718021 views
小学社会308993 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 %} で定義した領域を子テンプレートで上書きする仕組みである。