Flask入門|動的ルーティングを理解しよう【チャプター1-05】

ながみえ

一つ前のページではルーティングについて学習しました。

今回は 動的ルーティング について見ていきましょう。

Chapter1:Flask入門編
 ・Chapter1-1:Flaskとは何か
 ・Chapter1-2:Flaskの開発環境を構築しよう
 ・Chapter1-3:初めてのFlaskコードを書いてみよう
 ・Chapter1-4:ルーティングを理解しよう
 ・Chapter1-5:動的ルーティングを理解しよう ◁今回はここ
Chapter2:Jinja2入門編
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:Flaskの便利機能編
Chapter7:アプリ開発編

前回の「ルーティング」では、特定のURLにアクセスすると決まった内容が表示される仕組みを学びました。

例えば /hello にアクセスすると「Hello Flask!」が表示される、というようなルールです。

しかし、Webアプリを開発していくと「URLによって内容を変えたい」という場面がよく出てきます。

例えば /user/taro にアクセスしたときは「こんにちは、taroさん」と表示し、/user/hanako では「こんにちは、hanakoさん」と表示する、というようなことです。

このように、URLの一部を変数として扱い、それに応じた処理をする仕組み動的ルーティング と呼びます。

<<前のページ

Flaskの記事一覧

次のページ>>

Flaskの動的ルーティングを基礎から理解|変数付きURLと404処理

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

動的ルーティングの概要と利用場面

動的ルーティングとは、URLの一部を変数として受け取り、その値に応じて処理を変えることができる機能です。

通常の静的ルーティングでは /hello のように決まったURLしか扱えませんが、動的ルーティングでは /hello/〇〇 のように〇〇の部分を自由に変更できるようになります。

この機能を使うと、同じ処理をベースにしながらも表示内容を変えることができるため、効率的で柔軟なWebアプリを作成することができます。

URLに変数を含める方法と基本構文

Flaskでは以下のような構文を使って、URLの一部を変数として受け取ることができます。

@app.route("/hello/<name>") # もしこのURLにアクセスされたら
def hello(name):            # この関数を実行する
    return f"Hello, {name}!"
  • @app.route("/hello/<name>"): アクセスされたURLの中で、<name>の部分を変数として扱う
  • def hello(name):: <name>で受け取った値は、関数の引数として渡される
  • return f"Hello, {name}!": 受け取った変数を使って、メッセージを表示

以下は、実際に「名前を受け取って挨拶を表示する」動的ルーティングの例です。

from flask import Flask  # Flask本体をインポート
app = Flask(__name__)    # Flaskアプリケーションのインスタンスを作成

# 動的ルーティングを設定。URLの一部(<username>)を変数として受け取る
@app.route("/hello/<username>")
def greet(username):
    # HTMLタグを使って挨拶を表示。変数usernameの値を使ってメッセージを作る
    return f"<h1>こんにちは、{username}さん!</h1>"

# Flaskアプリケーションを実行
if __name__ == "__main__":
    app.run(debug=True)

このように、ユーザーごとに違う名前を表示できるWebページを簡単に作ることができます。

存在しないURLで404エラーが発生する理由と回避方法

Flaskでは、設定されていないURLにアクセスしようとすると自動的に404エラー(ページが見つかりません)が表示されます。

例えば、上の例で /hello/<username> を設定しているのに、
/hi/taro のように間違ったURLにアクセスすると、Flaskはそのルートを知らないため404エラーになります。

この動作はFlaskが自動で行ってくれるので、特にエラー処理を追加しなくても問題ありません。

まとめ

今回は、動的ルーティングの仕組みと、変数を使ってURLから値を受け取る方法について学びました。

<変数>を使えば、柔軟で個別対応できるページを簡単に作れるようになります。

次回からはいよいよFlaskの核心、テンプレートエンジン「Jinja2」について学んでいきます。

この調子でどんどん学習を進めていきましょう!

練習問題:辞書と動的ルーティングで情報表示アプリを作ろう

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

動的ルーティングの仕組みを使って、URLに入力された動物の名前に応じてその特徴を画面に表示するWebアプリを作成しましょう。

表示に使うHTMLタグは簡単なもので構いません。テンプレートの仕組み(Jinja2など)は使わず、Pythonの基本文法とFlaskの機能だけで完結させましょう。

あわせて読みたい
Pythonデータ構造|辞書の基本操作を実践で学ぼう【レッスン4-11】
Pythonデータ構造|辞書の基本操作を実践で学ぼう【レッスン4-11】

この問題の要件

以下の要件に従ってコードを完成させてください。

  • "/animal/<animal>" というURLパターンを動的ルーティングで設定し、<animal> の部分を変数として受け取ること
  • animal_info という関数を定義し、受け取った animal の値に応じて異なる結果を返すこと
  • URLに指定された動物名が上記の辞書に存在する場合は、その特徴をHTMLタグを使って表示すること
    ※例: <h1>ねこの特徴:</h1><p>静かで気まぐれな性格です。</p>
  • 指定された動物名が辞書に存在しない場合は、「〇〇についての情報は登録されていません。」という文を <h1> タグで表示すること
  • app.run(debug=True) でアプリケーションを実行すること
  • 辞書型のデータ features を用意し、以下のような動物の特徴を登録すること:

なお、登録する辞書型データは以下の内容とすること。

ねこ:静かで気まぐれな性格です。
いぬ:忠実で人懐っこい動物です。
うさぎ:耳が長くてぴょんぴょん跳ねます。
とり:空を飛ぶことができます。

ただし、以下のような実行結果となるコードを書くこと。

このコードを実行し、URL「http://localhost:5000/animal/うさぎ」にアクセスしたとき:

<h1>うさぎの特徴:</h1>
<p>耳が長くてぴょんぴょん跳ねます。</p>

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント:コードの構成を見る

正解のコードは上から順に以下のような構成となっています。

1:Flaskの機能を使うために、必要なモジュールをインポート
2:Flaskアプリ本体となるインスタンスを作成
3:「/animal/○○」というURLにアクセスされたときの処理を書く準備(動的ルーティングの設定)
4:URLから受け取った動物の名前をもとに、辞書から特徴を探して取り出す処理を作成
5:辞書にその動物名が登録されていない場合のメッセージを用意
6:このファイルが直接実行されたときだけ、Flaskアプリを起動するように設定

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

正解コード

例えば、以下のようなプログラムが考えられます。

Q
正解コード
# FlaskライブラリのFlaskクラスをインポート
from flask import Flask

# Flaskアプリケーションのインスタンスを作成
app = Flask(__name__)

# 動的ルーティング:URLの一部を変数animalとして受け取る
@app.route("/animal/<animal>")
def animal_info(animal):
    """
    animal(動物の名前)を受け取り、その特徴を返す関数
    """

    # 動物の名前に応じて特徴を返す辞書を作成(簡単な例)
    features = {
        "ねこ": "静かで気まぐれな性格です。",
        "いぬ": "忠実で人懐っこい動物です。",
        "うさぎ": "耳が長くてぴょんぴょん跳ねます。",
        "とり": "空を飛ぶことができます。",
    }

    # 指定された動物が辞書にあれば、その特徴を返す
    if animal in features:
        return f"<h1>{animal}の特徴:</h1><p>{features[animal]}</p>"
    else:
        # 辞書にない動物名が来た場合の処理
        return f"<h1>{animal}についての情報は登録されていません。</h1>"

# アプリケーションを起動するためのコード
if __name__ == "__main__":
    # 開発用にdebug=Trueを指定
    app.run(debug=True)

正解コードの詳細解説

正解コードをブロックごとに分割して解説します。

Q
正解コードの詳細解説

1:Flaskライブラリのインポート

from flask import Flask

FlaskというWebアプリケーションを作るためのライブラリから、Flask クラスだけをインポートしています。

このクラスを使うことで、Webサーバーとして動くアプリを作成できます。

2:Flaskアプリケーションのインスタンス生成

app = Flask(__name__)

Flaskクラスを使って、Webアプリの「本体」を作ります。

ここで __name__ という特別な変数を使うことで、Flaskがファイルの位置などを正しく認識できるようになります。

作成したアプリは app という変数名にしておくのが一般的です。

3:動的ルーティングの設定と関数定義

@app.route("/animal/<animal>")
def animal_info(animal):
  • @app.route("/animal/<animal>") は「このURLにアクセスされたら下の関数を実行してください」という指示です。
  • <animal> の部分は変数として扱われるURLの一部で、実際のURLに入力された文字が animal に入ります。
  • def animal_info(animal): は、その処理をする関数です。animal はURLから受け取った文字が入ります。

4:動物とその特徴を辞書で定義

features = {
    "ねこ": "静かで気まぐれな性格です。",
    "いぬ": "忠実で人懐っこい動物です。",
    "うさぎ": "耳が長くてぴょんぴょん跳ねます。",
    "とり": "空を飛ぶことができます。",
}
  • features という変数に辞書(dictionary)を作っています。
  • この辞書には、キーとして「動物の名前」、値として「その特徴」を登録しています。
  • 例:「ねこ」→「静かで気まぐれな性格です。」

5:辞書に存在するかどうかを調べて表示内容を変える

if animal in features:
    return f"<h1>{animal}の特徴:</h1><p>{features[animal]}</p>"
else:
    return f"<h1>{animal}についての情報は登録されていません。</h1>"
  • if animal in features: 受け取った動物名が、辞書 features に登録されているかどうかを確認します。
  • 登録されていれば、その特徴をHTMLの <h1><p> で表示します。
  • 登録されていなければ「情報は登録されていません」とエラーメッセージを表示します。

6:アプリの起動

if __name__ == "__main__":
    app.run(debug=True)
  • Pythonファイルを直接実行した場合だけ、アプリを起動するように設定しています。
  • debug=True にすると、開発中にエラーの詳細などが表示されて便利です(本番では False にします)。

<<前のページ

Flaskの記事一覧

次のページ>>

FAQ|Flaskの動的ルーティングでよくある疑問

Q
Q1. Flaskの動的ルーティングで使うURL変数はどんな名前でも大丈夫ですか?

はい、任意の名前を使用できます。ただし、コードの可読性やメンテナンス性を考慮して、意味のある変数名を使うのが推奨されます。

Q
Q2. URLに存在しない変数を指定すると、どうなりますか?

定義されていないルートや変数にアクセスすると、Flaskは自動的に404エラーページを表示します。エラーページの内容はカスタマイズも可能です。

Q
Q3. 複数のURL変数を使うことはできますか?

はい、Flaskでは1つのルートに複数のURL変数を指定することが可能です。たとえば/user/<username>/post/<int:post_id>のように複数のパラメータを扱えます。

質問用コンタクトフォーム

この記事を書くにあたりAIを活用しています。

人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。

記事URLをコピーしました