FlaskのJinja2テンプレートエンジンの使用方法
Flaskと組み合わせて使われる主要なテンプレートエンジンであるJinja2の基本的な使用方法を解説します。
概要
この記事ではFlaskで使用されるテンプレートエンジンJinja2について詳しく説明します。実行サンプルコードは次のGitHubリンクから確認できます。
ここでは、以下のバージョンを使用した、ルーティング方法を説明します。
Flask v2.1.2
Python v3.9.7
また、今回作成するコードは全て、GitHubに掲載しています。
テンプレートエンジンとは
テンプレートエンジンは、特定のデータモデルに基づいて入力データをドキュメント形式で出力するためのソフトウェアコンポーネントです。FlaskでデータをHTMLに出力する際、APIリクエストを行いレスポンスデータを加工する必要がありますが、テンプレートエンジンを利用することで、この一連の煩雑な処理を簡素化し、データをHTML形式で簡単に出力することが可能になります。
Jinja2とFlask
FlaskはデフォルトでJinja2というテンプレートエンジンをサポートしています。Jinja2は強力で柔軟性のあるテンプレートエンジンで、複雑なロジックをテンプレートに組み込むことが可能です。
Jinja2の使用方法
Jinja2を使用するためにはまず、テンプレートファイルを保存するディレクトリを設定します。この例では、templates
ディレクトリを作成し、その中にhello.html
というファイルを保存します。
Jinja2のサンプルコードは次の通りです。
app.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def home():
message = "hello world"
return render_template("hello.html", message=message)
Jinja2テンプレートはHTML要素をインデントで区切って追加します。
hello.html
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<p>{{ message }}</p>
</body>
</html>
export FLASK_APP=app.py
flask run
以上の手順を踏んだら、アプリケーションを実行して、http://localhost:5000 にアクセスしてみましょう。
Jinja2のテンプレート構文詳解
Jinja2テンプレートエンジンは多様な構文をサポートしており、テンプレート内での動的な処理を可能にします。以下に、Jinja2の主な構文とその使用例を挙げて説明します。
変数
Jinja2で変数を表示するには、その変数を2つの波括弧 {{ }}
で囲みます。これを変数ブロックと呼びます。このブロックは、テンプレートがレンダリングされる際に評価され、その値に置換されます。
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<p>{{ message }}</p>
</body>
</html>
上記のテンプレートでは、Flaskアプリケーションからmessage
変数が渡されると、{{ message }}
はその値に置換されます。
制御構造
Jinja2は制御構造もサポートしています。たとえば、if文やfor文を使用することが可能です。これらの構文は {% %}
で囲まれます。
if文の例:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
{% if message %}
<p>{{ message }}</p>
{% else %}
<p>No message available.</p>
{% endif %}
</body>
</html>
この例では、message
変数が存在する場合はその内容を表示し、そうでなければ"No message available.“と表示します。
for文の例:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<ul>
{% for item in list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
この例では、list
という名前のリスト変数が存在する場合、その要素すべてを順に表示します。
フィルター
フィルターは、変数を変換するためのもので、|
記号を使って変数の後に適用します。一部のフィルターでは引数を取ることも可能です。
<p>{{ message|capitalize }}</p>
この例では、capitalize
フィルターが適用され、message
変数の先頭文字が大文字になります。