Flaskを使ってHello, Worldをやってみる-3

Python

前回のつづきです。今回は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で対応するページが表示されるようになりました。

index.html を表示
index.html を表示
hello.html を引数なしで表示
hello.html を引数なしで表示
hello.html をname=USAで表示
hello.html をname=USAで表示

コメント

タイトルとURLをコピーしました