カテゴリ: Flask 更新日: 2025/11/29

FlaskのテンプレートエンジンJinja2とは?基本の書き方と使い方を解説

FlaskのテンプレートエンジンJinja2とは?基本の書き方と使い方を解説
FlaskのテンプレートエンジンJinja2とは?基本の書き方と使い方を解説

先生と生徒の会話形式で理解しよう

生徒

「FlaskでWebページを作るときに、HTMLをどうやって表示するんですか?」

先生

「FlaskではJinja2(ジンジャ・ツー)というテンプレートエンジンを使って、HTMLを動的に生成します。」

生徒

「テンプレートエンジンってなんですか?」

先生

「テンプレートエンジンとは、HTMLの中にPythonの値や処理を埋め込む仕組みです。では、実際に使い方を見ていきましょう!」

1. FlaskとJinja2とは?

1. FlaskとJinja2とは?
1. FlaskとJinja2とは?

PythonのWebフレームワークであるFlask(フラスク)は、WebサイトやWebアプリを簡単に作るためのツールです。そして、Flaskの中でHTMLを表示するときに活躍するのがJinja2(ジンジャ・ツー)です。

Jinja2はテンプレートエンジンと呼ばれますが、これは「型紙(テンプレート)のようにHTMLの雛形を作り、そこにデータを流し込んでページを完成させる」仕組みです。

2. Jinja2の基本的な使い方

2. Jinja2の基本的な使い方
2. Jinja2の基本的な使い方

FlaskでJinja2を使うためには、まずHTMLファイルをtemplatesという名前のフォルダに保存します。

たとえば、hello.htmlというHTMLテンプレートを作りたいときは、次のようにします。



<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>こんにちは</title>
</head>
<body>
    <h1>こんにちは、{{ name }}さん!</h1>
</body>
</html>

{{ name }}の部分がポイントです。これはJinja2の「変数」を表示する書き方で、Pythonから渡した値がここに入ります。

3. Flaskでテンプレートを表示する

3. Flaskでテンプレートを表示する
3. Flaskでテンプレートを表示する

次に、Flaskでこのテンプレートを表示するPythonコードを書いてみましょう。


from flask import Flask, render_template

app = Flask(**name**)

@app.route("/")
def hello():
name = "結衣"
return render\_template("hello.html", name=name)

if **name** == "**main**":
app.run(debug=True)

render\_template()という関数を使うと、HTMLファイルと変数(この場合はname)をつなげて表示できます。

4. if文とfor文を使ったJinja2の応用

4. if文とfor文を使ったJinja2の応用
4. if文とfor文を使ったJinja2の応用

Jinja2ではif文for文も使えます。HTMLの中で条件分岐や繰り返し処理ができるんです。


<!-- templates/loop.html -->
<ul>
{% for item in items %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

@app.route("/list")
def show_list():
    items = ["りんご", "バナナ", "ぶどう"]
    return render_template("loop.html", items=items)

{% for item in items %}{% endfor %}の間でリストを繰り返し表示できます。

5. コメントや安全な表示方法

5. コメントや安全な表示方法
5. コメントや安全な表示方法

Jinja2ではHTMLの中にPythonコードを入れるとき、表示されないようにしたい部分はコメントにできます。


{# これはJinja2のコメントです。HTMLには表示されません #}

また、{{ 変数 }}の中にHTMLタグが入っていても、自動的に無害化されます(セキュリティ対策)。

たとえば、次のように悪意のあるHTMLが入っても、FlaskとJinja2は安全な形で表示してくれます。


@app.route("/safe")
def safe():
    name = "<script>alert('危険!')</script>"
    return render_template("hello.html", name=name)

6. Jinja2の文法まとめと注意点

6. Jinja2の文法まとめと注意点
6. Jinja2の文法まとめと注意点
  • {{ 変数 }}:値を表示する
  • {% if 条件 %} ... {% endif %}:条件分岐
  • {% for item in items %} ... {% endfor %}:繰り返し
  • {# コメント #}:テンプレート内のコメント

HTMLの中にPythonを書いているような気がするかもしれませんが、実際にはPythonとは別物のテンプレート構文です。Jinja2の記号には独自のルールがあるので、{% %}{{ }}の使い方を間違えないようにしましょう。

まとめ

まとめ
まとめ

Flaskで使われるテンプレートエンジンJinja2は、Webアプリケーションを構築する際に欠かせない重要な仕組みです。HTMLに動的な値を埋め込み、柔軟にページを生成できるため、Flaskによる開発の中心となります。今回学んだ内容を振り返りながら、Jinja2がどのように役立つのか、どんな文法がありどのように応用できるのかを整理して理解を深めていきましょう。

Jinja2の大きな特徴として、{{ }}{% %} といった特別な記号によって値の埋め込みや条件分岐、繰り返し処理を実現できる点があります。HTMLという静的な構造に対し、動的なデータを自然に組み込めるため、ユーザーに応じた画面表示や、リストの動的描画、フォームの値の反映など、さまざまなWebアプリでの標準的な処理に適しています。

また、Flask側で render_template() を使って変数をテンプレートへ渡す仕組みも、テンプレートエンジンならではの重要な流れです。テンプレートファイルは templates フォルダに置き、Python側からデータを受け取って最終的なHTMLとしてブラウザに出力されます。この仕組みによって、Flaskはロジックと見た目を分離し、整ったコード構成を維持しやすくしています。

応用として、テンプレートの中ではif文for文を利用でき、さらにコメント機能や安全な自動エスケープ機能も備わっています。これにより、ユーザーから渡された値に悪意あるスクリプトが含まれていても、勝手に実行されてしまうことなく安全に表示できます。特にWebアプリではセキュリティが欠かせないため、この自動エスケープ機能はとても重要です。

例えば、商品一覧ページの表示や、ユーザー名の埋め込み、検索結果のリスト表示など、Webアプリで頻出する処理の多くは、このJinja2の基本文法で実装できます。複雑なページでも、テンプレートにデータを渡し、それを適切にループや条件分岐で処理するだけで動的なページが簡単に生成できます。

また、テンプレートのネストやレイアウト拡張にも対応しているため、より大型のWebアプリケーションでもスケールしやすい構造を作ることができます。特に、複数ページで共通するヘッダー、フッター、メニューバーなどをテンプレート継承で管理すると、保守性が大幅に向上します。

これからFlaskでアプリを作る際は、まずはテンプレートにどのデータを渡し、どのように表示したいかを整理するところから始めると良いでしょう。Jinja2は直感的でわかりやすいため、文法に慣れると開発スピードは一気に上がります。今回学んだ基礎を土台により高度なテンプレート活用へ進んでいくことで、Webアプリの表現力を自由自在に拡張していけるようになります。

■ Jinja2の応用例サンプルコード


<!-- templates/dashboard.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ダッシュボード</title>
</head>
<body>
    <h1>{{ user_name }}さんのダッシュボード</h1>

    {% if notifications %}
        <h2>お知らせ</h2>
        <ul>
            {% for n in notifications %}
                <li>{{ n }}</li>
            {% endfor %}
        </ul>
    {% else %}
        <p>現在お知らせはありません。</p>
    {% endif %}

    <h2>お気に入りアイテム</h2>
    <ul>
        {% for item in favorites %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
</body>
</html>

# app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/dashboard")
def dashboard():
    return render_template(
        "dashboard.html",
        user_name="結衣",
        notifications=["新しいメッセージがあります", "パスワードの期限が近づいています"],
        favorites=["りんご", "バナナ", "メロン"]
    )

if __name__ == "__main__":
    app.run(debug=True)

このようにテンプレートに複数の変数を渡し、Jinja2側で柔軟に処理することで、ユーザーごとに異なるページ内容を簡単に表現できます。アプリの成長に合わせて、テンプレート側に処理を分離していくことでコードが整理され、管理しやすい構造を維持できます。

先生と生徒の振り返り会話

生徒:「Jinja2ってHTMLの中でPythonみたいなことができるんですね!不思議な感じです。」

先生:「そうですね。Pythonそのものではありませんが、Pythonで扱うデータをHTMLに綺麗に埋め込むのが得意なんです。」

生徒:{{ }}{% %} の違いもよく分かりました。表示したいときは {{ }}、処理は {% %} なんですね!」

先生:「その理解で完璧です。テンプレート内の処理を整理しやすくなりますよ。」

生徒:「for文でリストを表示したり、if文で条件分岐したり、結構なんでもできるんですね!」

先生:「応用するともっと便利になりますよ。テンプレート継承なども学ぶと、大規模なアプリでも構造がまとまります。」

生徒:「まずは今日学んだ変数、if、forの基本文法をしっかり使えるようにします!」

先生:「その積み重ねが大切です。どんどんテンプレートを作って慣れていきましょう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

FlaskのテンプレートエンジンJinja2とは何ですか?初心者にもわかるように教えてください

Jinja2(ジンジャ・ツー)とは、FlaskでHTMLを動的に生成するためのテンプレートエンジンです。HTMLの中にPythonの値や処理を埋め込むことで、ユーザーごとに違う内容のWebページを作ることができます。
カテゴリの一覧へ
新着記事
New1
Flask
Flaskでデータベースエラーを処理する方法!初心者にもわかる例外の使い方
New2
Flask
FlaskでリダイレクトやURL生成を行う方法!便利な関数の使い方を解説
New3
Flask
FlaskでPOSTリクエストを受け取る方法!初心者でもわかるJSONデータの受け取り方
New4
Flask
Flask‑Mailの使い方!アプリからメールを送信する基本方法を解説
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Django
DjangoとFlaskの違いを完全比較!初心者でもわかるPythonフレームワーク入門
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Python
Pythonでリストをコピーする方法!copy()・スライス・list()の使い方を比較
No.5
Java&Spring記事人気No5
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.6
Java&Spring記事人気No6
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.7
Java&Spring記事人気No7
Python
Pythonで空白や不要な文字を削除する方法!strip(), rstrip(), lstrip() の使い方を初心者向けに解説
No.8
Java&Spring記事人気No8
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説