英語609652 views
Computer366119 views
教育149096 views
中学数学622131 views
中学理科1627838 views
数学講師2864449 views
小学理科718021 views
高校国語786382 views
MathPython493500 views
高校倫理1435514 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 %} で定義した領域を子テンプレートで上書きする仕組みである。