前回のつづきです。今回はURLによって別ページを表示できるようにします。
別ページを作成
複数のページに対して共通の記述が多くなる場合があります。こういう時は、共通部分をベーステンプレートとして作成し、それを継承して子テンプレートを作成します。詳しくはJinja2のドキュメントを参照してください。
base.html を作成
まずベーステンプレートとしてtemplates
フォルダにbase.html
を作成します。
ベーステンプレートにブロックタグ{% block %}
を定義しておくことで、子テンプレートの内容を埋め込むことが可能になります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}{% endblock %} - Document</title>
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
index.html を修正
もともとあるindex.html を、base.html を継承した子テンプレートとしての記述に修正します。
{% extends 'base.html' %}
{% block title %}
index
{% endblock %}
{% block body %}
<h1>Hello, World!</h1>
{% endblock %}
{% extends 'base.html' %}
{% extends %}
は、ベーステンプレートを継承するための記述です。
{% block title %}
index
{% endblock %}
ベーステンプレートの{% block title %}{% endblock %}
にindex
が埋め込まれます。
{% block body %}
<h1>Hello, World!</h1>
{% endblock %}
ベーステンプレートの{% block body %}{% endblock %}
に<h1>Hello, World!</h1>
が埋め込まれます。
hello.html を作成
index.html
と同様に、templates
フォルダにhello.html
を作成します。
{% extends 'base.html' %}
{% block title %}
hello
{% endblock %}
{% block body %}
<h1>Hello, {{ name }}!</h1>
{% endblock %}
<h1>Hello, {{ name }}!</h1>
{{ name }}
のようにすることで、pythonから渡された変数を表示することが可能です。
ルーティングを設定
/hello/
でアクセスされた場合に、hello.html
が表示されるように、application.py
を修正します。また、hello の後ろにname を渡せるようにして、hello.html 内に表示します。
from flask import Flask, render_template
application = Flask(__name__)
@application.route('/')
def index():
return render_template('index.html')
@application.route('/hello/')
@application.route('/hello/<name>')
def hello(name='Japan'):
return render_template('hello.html', name=name)
@application.route('/hello/<name>')
def hello(name='Japan'):
<name>
のようにすると、URLに変数のセクションを追加することができ、関数のキーワード引数として使用できます。ここではhello関数の引数として使用し、省略された場合はJapan
としています。
ブラウザで確認すると、それぞれのURLで対応するページが表示されるようになりました。
コメント