Flask基礎#3 テンプレートエンジン(Jinja2)
Jinja2の基本構文(変数、ループ、条件分岐)
FlaskのJinja2テンプレートエンジンは、HTMLテンプレート内でPythonのような構文を使用して動的なコンテンツを生成できる強力なツールです。
変数の表示:
変数は二重中括弧で囲んで表示します。
<p>こんにちは、{{ user.name }}さん!</p>
ループ:
forループを使用してリストや辞書の要素を繰り返し処理できます。
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
ループ内では特別な変数loop.indexやloop.index0が使用でき、現在の繰り返し回数を取得できます。
条件分岐:
if、elif、elseを使用して条件分岐を行います。
{% if user.role == 'admin' %}
<p>管理者としてログインしています。</p>
{% elif user.role == 'user' %}
<p>ユーザーとしてログインしています。</p>
{% else %}
<p>ゲストとしてアクセスしています。</p>
{% endif %}
複合条件も使用可能です:
{% if user.is_authenticated and user.role == 'admin' %}
<p>管理者としてログインしています。</p>
{% endif %}
ループと条件分岐の組み合わせ:
<ul>
{% for item in items %}
{% if item.is_available %}
<li>{{ item.name }}</li>
{% endif %}
{% endfor %}
</ul>
インライン条件式:
<p>{{ 'ログイン済み' if user.is_authenticated else '未ログイン' }}</p>
フィルタの使用:
変数にフィルタを適用して値を変換できます。
{{ comments|length }}
これはcommentsリストの長さを表示します。
テンプレートの継承:
base.htmlを作成し、他のテンプレートで継承することで、共通のレイアウトを維持できます。
{% extends "base.html" %}
{% block content %}
<!-- ページ固有のコンテンツ -->
{% endblock %}
これらの機能を組み合わせることで、Flaskアプリケーションで動的で柔軟なHTMLテンプレートを作成できます。
Jinja2の構文はPythonに似ているため、Pythonプログラマーにとって学習が容易です。
テンプレートの継承(base.htmlの作成)
Flaskのテンプレート継承は、Jinja2テンプレートエンジンの強力な機能の一つです。
これにより、共通のレイアウトを定義し、個々のページで特定の部分だけを変更することができます。
基本的な手順は以下の通りです:
base.htmlの作成:
まず、すべてのページに共通する要素を含むbase.htmlを作成します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}Default Title{% endblock %}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
<header>
<h1>My Flask App</h1>
<nav>
<ul>
<li><a href="{{ url_for('index') }}">Home</a></li>
<li><a href="{{ url_for('about') }}">About</a></li>
<li><a href="{{ url_for('contact') }}">Contact</a></li>
</ul>
</nav>
</header>
<main>
{% block content %}
{% endblock %}
</main>
<footer>
<p>© 2023 My Flask App</p>
</footer>
</body>
</html>
このbase.htmlでは、{% block %}タグを使用して、子テンプレートで上書き可能な部分を定義しています。
子テンプレートの作成:
次に、base.htmlを継承する子テンプレートを作成します。例えば、index.html:
{% extends "base.html" %}
{% block title %}Home Page{% endblock %}
{% block content %}
<h2>Welcome to the Home Page</h2>
<p>This is the content of the home page.</p>
{% endblock %}
この子テンプレートは{% extends %}タグを使用してbase.htmlを継承し、必要な部分だけを上書きしています。
Flaskアプリケーションでの使用:
Flaskアプリケーションで、これらのテンプレートを使用します。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/about')
def about():
return render_template('about.html')
@app.route('/contact')
def contact():
return render_template('contact.html')
if __name__ == '__main__':
app.run(debug=True)
テンプレート継承の利点:
コードの重複を減らし、保守性を向上させる
サイト全体の一貫性を保つ
個々のページの変更を容易にする
テンプレート継承を使用することで、効率的で管理しやすいWebアプリケーションを構築できます。
共通のレイアウトを一箇所で管理し、各ページの固有のコンテンツに集中することができます。
静的ファイル(CSS、JS、画像)の提供方法
Flaskでは、静的ファイル(CSS、JavaScript、画像など)を提供するために、「static」というディレクトリを使用します。
このディレクトリは、Flaskアプリケーションのルートディレクトリに作成します。
静的ファイルの基本的な構造は以下のようになります:
/myproject
/static
/css
/js
/images
/templates
app.py
HTMLテンプレート内で静的ファイルを参照するには、url_for()関数を使用します。
例えば:
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<script src="{{ url_for('static', filename='js/script.js') }}"></script>
<img src="{{ url_for('static', filename='images/logo.png') }}">
url_for()関数を使用することで、静的ファイルのパスが動的に生成され、ファイル構造が変更された場合でも柔軟に対応できます。
Flaskアプリケーション内では、静的ファイルを提供するための特別な設定は必要ありません。
Flaskは自動的に/staticエンドポイントを作成し、staticディレクトリ内のファイルを提供します。
例えば、以下のようなFlaskアプリケーションがあるとします:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
このアプリケーションで静的ファイルを使用するには、単にstaticディレクトリにファイルを配置し、HTMLテンプレート内でurl_for()関数を使用して参照するだけです。
大規模なアプリケーションや本番環境では、パフォーマンスを向上させるために、NginxやApacheなどの専用のHTTPサーバーを使用して静的ファイルを提供することが推奨されます。
静的ファイルの提供は、Webアプリケーションの見た目や機能性を向上させるために重要です。
CSSでスタイルを適用し、JavaScriptで動的な機能を追加し、画像でビジュアル要素を強化することができます。
Flaskの静的ファイル提供機能を適切に使用することで、効率的で魅力的なWebアプリケーションを構築できます。
テンプレートを使用したナビゲーション付きのWebページを作成
課題
次の要件を満たすFlaskアプリケーションを作成してください:
ホーム、About、Contactの3つのページを持つ
共通のナビゲーションバーを全てのページに表示する
テンプレート継承を使用して、共通のレイアウトを定義する
各ページに固有のコンテンツを表示する
簡単なCSSを適用してスタイリングを行う
回答例
ここから先は
¥ 300
Amazonギフトカード5,000円分が当たる
サポートもお待ちしております! 頂いたサポートは今後の創作活動費用として、noteとYouTubeに活用させていただければと考えております!