Flaskの動的ルーティングとは、URLの一部を変数として扱い、アクセスするたびに異なるデータを処理できる仕組みです。
通常のルーティング(例:@app.route("/")
や @app.route("/about")
)では、決まったURLに対してのみ処理を決めることができます。しかし、動的ルーティングを使うと、URLの一部を変数として扱い、ユーザーごとに異なるページを表示することが可能になります。
通常のルーティングに関しては下の記事で解説しています。

動的ルーティングなしで書いてみる
from flask import Flask
app = Flask(__name__)
# 手動で個別にルートを設定すると面倒
@app.route("/tanaka")
def tanaka():
return "Hello, Tanaka!"
@app.route("/yasuda")
def yasuda():
return "Hello, Yasuda!"
@app.route("/suzuki")
def suzuki():
return "Hello, Suzuki!"
# → これではユーザーが増えるたびに @app.route を追加する必要がある…
if __name__ == "__main__":
app.run(debug=True)
もしあなたが、ユーザーの名前を表示するものを作りたいとき。このようにいちいち名前を書いていたらこの作業だけで時間をつぶしてしまいます。
なので名前のところだけ変数にして、いちいち書かなくていいようにしましょう。
動的ルーティングありで書いてみる

from flask import Flask
app = Flask(__name__)
@app.route("/user/<name>")
def user(name):
return f"Hello, {name}!"
if __name__ == "__main__":
app.run(debug=True)
上のコードにすることで動的ルーティングなしで書いた時より短く書けますし、
新たな名前にした時も、自動で対応できます。
http://127.0.0.1:5000/user/tanaka
→ “Hello, tanaka!”http://127.0.0.1:5000/user/yasuda
→ “Hello, yasuda!”http://127.0.0.1:5000/user/suzuki
→ “Hello, suzuki!”http://127.0.0.1:5000/user/sato
→ “Hello, sato!” (新しい名前でも自動対応!)
型指定もできる
整数型

from flask import Flask
app = Flask(__name__)
@app.route("/post/<int:post_id>")
def user_profile(post_id):
return f"User ID: {post_id}"
if __name__ == "__main__":
app.run(debug=True)
アクセスURL | 出力 |
---|---|
http://127.0.0.1:5000/user/123 | User ID: 123 |
http://127.0.0.1:5000/user/alice | エラー(404 Not Found) |
上のコードは整数が入力されたときのみ、ページを返すということですね。
例えば123と入力したら
http://127.0.0.1:5000/user/123
→ “User ID: 123“
となりますが、aliceという文字列を入力した場合は
http://127.0.0.1:5000/user/alice
→ エラー(404 Not Found) ←整数ではないから
このようにエラーとなります。
float(小数)型
from flask import Flask
app = Flask(__name__)
@app.route("/price/<float:amount>") # 小数を受け取る
def show_price(amount):
return f"Price: ${amount}"
if __name__ == "__main__":
app.run(debug=True)
アクセスURL | 出力 |
---|---|
/price/19.99 | Price: $19.99 |
/price/100 | Price: $100.0 |
intと異なり、小数点も受け取れるようになります。100のような数字を渡すと100.0のように小数点がついた形で表示されますね。
path(スラッシュを含む文字列)型
from flask import Flask
app = Flask(__name__)
@app.route("/file/<path:filepath>") # スラッシュを含むパスを受け取る
def get_file(filepath):
return f"Requested file: {filepath}"
if __name__ == "__main__":
app.run(debug=True)
アクセスURL | 受け取る値 | 出力 |
---|---|---|
/file/report.txt | "report.txt" | Requested file: report.txt |
/file/docs/manual.pdf | "docs/manual.pdf" | Requested file: docs/manual.pdf |
/file/images/photo.jpg | "images/photo.jpg" | Requested file: images/photo.jpg |
通常の string
ではスラッシュ(/
)を含むURLを渡すことはできませんが、path
を使うことでスラッシュを含むパスを受け取ることができます。
uuidというのも受け取ることができますが、これは使うときがくれば説明します。uuid
→ UUID(例:/token/550e8400-e29b-41d4-a716-446655440000
)
複数の値を受け取る
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>/post/<int:post_id>')
def show_post(username, post_id):
return f"{username} さんの投稿 ID は {post_id} です"
if __name__ == "__main__":
app.run(debug=True)
上のコードで例えば/user/john/post/42
にアクセスすると、
username
には john
post_id
には 42
が渡されます。
一つだけではなく複数の値も受け取れます。
まとめ
Flaskの動的ルーティングを使うことで、URLに変数を埋め込んで動的に処理を行うことができ、アプリケーションの柔軟性が高まります。パラメータの型指定や複数のパラメータを受け取ることができるので、いろんな場面でご活用いいただけると思います。