MENU

Flaskの動的ルーティングをわかりやすく解説!【flask初心者講座その3】

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/123User ID: 123
http://127.0.0.1:5000/user/aliceエラー(404 Not Found)

上のコードは整数が入力されたときのみ、ページを返すということですね。

例えば123と入力したら

http://127.0.0.1:5000/user/123User 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.99Price: $19.99
/price/100Price: $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に変数を埋め込んで動的に処理を行うことができ、アプリケーションの柔軟性が高まります。パラメータの型指定や複数のパラメータを受け取ることができるので、いろんな場面でご活用いいただけると思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次