ある程度複雑なアプリケーションでは複数のWebページを必要とするため、テンプレートファイルも複数用意することになります。これらをすべて直書きしていてはメンテナンスが大変ですが、Flaskのテンプレートエンジンでは共通部分を分割して管理することができます。
目次
共通テンプレートの作成
Webページのテンプレートにはヘッダー部分やナビゲーション、サイドバー、フッターなどすべてのページ、あるいは多くのページに共通する部分がいくつもあります。
これらの共通部分を分割して管理できれば、ヘッダー部分を少しだけ変えたい、といったメンテナンスが非常に楽になります。
実際にやってみましょう。
まずは templates フォルダにテンプレートファイル(index.html)をコピーした layout.html というファイルを作成します。
この layout.html を共通テンプレートにしましょう。
次のように記述します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Flaskを使ってみよう!</title> </head> <body> {% block content %} {% endblock %} </body> </html>
この block content の部分に別途作成した個別テンプレートの内容をはめ込むことができます。
共通テンプレートを呼び出し
次に個別テンプレート側に、共通テンプレートの内容を呼び出す処理を記述します。
index.html に次のように記述します。
{% extends "layout.html" %} <!-- 共通テンプレートの呼び出し --> {% block content %} <h1>トップページです</h1> <p>なんとここはトップページなのです</p> {% endblock %}
1行目の {% extends “layout.html” %} で共通テンプレート(layout.html)を呼び出しています。
そして3行目の block content から6行目の endblock で挟んだ部分が layout.html の block content と記述した部分で呼び出されます。
ではflaskコマンドを使ってアプリケーションを実行し、ブラウザで確認してみましょう。
トップページ(http://127.0.0.1:5000/)にアクセスします。
1つのファイルで管理していた時と同じように、テンプレートの中身が表示できています。
共通テンプレートの活用
ここまでだと1つのページしか作成していないので、テンプレートを分割するメリットがいまいちわかりません。
むしろファイルを2つ作らないといけないぶん面倒だと感じたかもしれません。
そこで共通テンプレートを活用してもう1つ個別テンプレートを作ってみましょう。
まずhello.py に次のように記述します。
from flask import Flask, render_template app = Flask(__name__) # ルートディレクトリのURLをトリガーに @app.route("/") def index(): # index.htmlファイルをテンプレートとして呼び出す return render_template("index.html") # /aboutのURL @app.route("/about") def about(): # about.htmlファイルをテンプレートとして呼び出す return render_template("about.html")
/about のURLにアクセスした時に about.html 内容を出力するよう記述しました。
次に、/templates の下に about.html を作成しましょう。
次のように記述します。
{%extends "layout.html" %} <!-- 共通テンプレートの呼び出し --> {% block content %} <h1>About Us</h1> <p>なんと我々についての紹介ページなのです</p> {% endblock %}
こちらのページでも html の宣言をしたり、言語や文字コードの記述は同じなので、共通テンプレートを使いまわすことができます。
このように共通部分は {%extends “layout.html” %} の1行を書くだけでいいので、新しくページを作る際に簡単に使いまわせます。
もし共通部分を変更したくなった時も修正が必要になるのは layout.html ファイル1つだけなのでメンテナンスも簡単です。
flaskコマンドを使ってアプリケーションを実行し、ブラウザで確認してみましょう。
http://127.0.0.1:5000/about にアクセスします。
こちらも共通テンプレートの内容が使いまわされて問題なく表示されています。