【Flask】動的ルーティングを理解しよう|Chapter1-5

一つ前のページではルーティングについて学習しました。
今回は 動的ルーティング について見ていきましょう。
Chapter1:Flask入門編
 ・Chapter1-1:Flaskとは何か
 ・Chapter1-2:Flaskの開発環境を構築しよう
 ・Chapter1-3:初めてのFlaskコードを書いてみよう
 ・Chapter1-4:ルーティングを理解しよう
 ・Chapter1-5:動的ルーティングを理解しよう ◁今回はここ
Chapter2:Jinja2入門編
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:エラーハンドリングとデバッグ編
Chapter7:アプリ開発編
前回の「ルーティングを理解しよう」では、特定のURLにアクセスすると決まった内容が表示される仕組みを学びました。
例えば /hello にアクセスすると「Hello Flask!」が表示される、というようなルールです。
しかし、Webアプリを開発していくと「URLに変数を付けて、それによって内容を変えたい」という場面がよく出てきます。
例えば /user/taro にアクセスしたときは「こんにちは、taroさん」と表示し、/user/hanako では「こんにちは、hanakoさん」と表示する、というようなことです。
このように、URLの一部を変数として扱い、それに応じた処理をする仕組みを 動的ルーティング と呼びます。
- Flask開発を Stream Deck でボタン化しよう!
- 
Flaskは非常に軽量かつシンプルなフレームワークですが、それゆえに定型作業が多く、開発は単調な作業の連続になりがちです。 それこそがFlaskのメリットであり、習得難易度が低い理由でもありますが、単調な作業は退屈で、ミスも起こりやすいでしょう。 そこで役に立つのが Stream Deck 。 このような定型手順が多い作業を “ボタン化” することで視覚化。 圧倒的に 効率的 かつ ストレスフリー な開発環境が簡単に手に入ります↓↓ あわせて読みたいFlask開発をStreamDeckでボタン化しようあわせて読みたいプログラマー向けStream Deckの選び方|初心者でも失敗しないモデル比較ガイド
動的ルーティングの基礎|変数付きURLと404処理

動的ルーティングの概要と利用場面
動的ルーティングとは、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」について学んでいきます。
この調子でどんどん学習を進めていきましょう!
- サイト改善アンケート|1分だけ、ご意見をお聞かせください
- 
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。 
 そのため、ご利用者のみなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。ご協力いただけますと幸いです。 アンケート
練習問題:辞書と動的ルーティングで情報表示アプリを作ろう

動的ルーティングの仕組みを使って、URLに入力された動物の名前に応じてその特徴を画面に表示するWebアプリを作成しましょう。
表示に使うHTMLタグは簡単なもので構いません。テンプレートの仕組み(Jinja2など)は使わず、Pythonの基本文法とFlaskの機能だけで完結させましょう。

この問題の要件
以下の要件に従ってコードを完成させてください。
- "/animal/<animal>"というURLパターンを動的ルーティングで設定し、- <animal>の部分を変数として受け取ること
- animal_infoという関数を定義し、受け取った- animalの値に応じて異なる結果を返すこと
- URLに指定された動物名が上記の辞書に存在する場合は、その特徴をHTMLタグを使って表示すること
 ※例:<h1>ねこの特徴:</h1><p>静かで気まぐれな性格です。</p>
- 指定された動物名が辞書に存在しない場合は、「〇〇についての情報は登録されていません。」という文を <h1>タグで表示すること
- 辞書型のデータ featuresを用意し、以下のような動物の特徴を登録すること:
なお、登録する辞書型データは以下の内容とすること。
ねこ:静かで気まぐれな性格です。
いぬ:忠実で人懐っこい動物です。
うさぎ:耳が長くてぴょんぴょん跳ねます。
とり:空を飛ぶことができます。
ただし、以下のような実行結果となるコードを書くこと。
このコードを実行し、URL「http://localhost:5000/animal/うさぎ」にアクセスしたとき:
<h1>うさぎの特徴:</h1> <p>耳が長くてぴょんぴょん跳ねます。</p>
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント:コードの構成を見る
- 
正解のコードは上から順に以下のような構成となっています。 1:Flaskの機能を使うために、必要なモジュールをインポート 
 2:Flaskアプリ本体となるインスタンスを作成
 3:「/animal/○○」というURLにアクセスされたときの処理を書く準備(動的ルーティングの設定)
 4:URLから受け取った動物の名前をもとに、辞書から特徴を探して取り出す処理を作成
 5:辞書にその動物名が登録されていない場合のメッセージを用意
 6:このファイルが直接実行されたときだけ、Flaskアプリを起動するように設定
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
正解コード
例えば、以下のようなプログラムが考えられます。
- 正解コード
- 
# 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)
正解コードの詳細解説
正解コードをブロックごとに分割して解説します。
- 正解コードの詳細解説
- 
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にします)。
 
FAQ|Flaskの動的ルーティングでよくある疑問
- Q1. Flaskの動的ルーティングで使うURL変数はどんな名前でも大丈夫ですか?
- 
はい、任意の名前を使用できます。ただし、コードの可読性やメンテナンス性を考慮して、意味のある変数名を使うのが推奨されます。 
- Q2. URLに存在しない変数を指定すると、どうなりますか?
- 
定義されていないルートや変数にアクセスすると、Flaskは自動的に404エラーページを表示します。エラーページの内容はカスタマイズも可能です。 
- Q3. 複数のURL変数を使うことはできますか?
- 
はい、Flaskでは1つのルートに複数のURL変数を指定することが可能です。たとえば /user/<username>/post/<int:post_id>のように複数のパラメータを扱えます。






