Flask入門|url_for関数で動的リンクを生成する方法をやさしく解説【チャプター2-03】

ながみえ

一つ前のページではテンプレートの継承について学習しました。

今回は url_for関数 について見ていきましょう。

Chapter1:Flask入門編
Chapter2:Jinja2入門編

 ・Chapter2-1:Jinja2とは何か|テンプレートエンジン入門
 ・Chapter2-2:テンプレートの継承を理解しよう
 ・Chapter2-3:url_for関数を理解しよう ◁今回はここ
 ・Chapter2-4:render_template関数を理解しよう
 ・Chapter2-5:テンプレートと繰り返し処理
 ・Chapter2-6:テンプレートと分岐処理
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:Flaskの便利機能編
Chapter7:アプリ開発編

FlaskでWebアプリを開発していると、「リンク先を指定する」場面に何度も遭遇します。

このときURLパスをそのままHTMLにベタ書きしてしまうと、後々のルート変更などでコードのメンテナンスがとても大変になります。

Flaskでは、この問題を解決するために url_for() という便利な関数が用意されており、ルーティングで定義した関数名から自動的に対応するURLパスを生成できます。

この記事では、url_for() の基本から使い方まで、初心者にもわかりやすく丁寧に解説していきます。

<<前のページ

Flaskの記事一覧

次のページ>>

Flaskのurl_for関数でリンクを動的生成する方法と基本構文

url_for() は、Flaskにおける「関数名からURLを生成する関数」です。

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

url_for関数とは?Flaskアプリでルートに依存しないリンクを生成する理由

通常、HTMLでリンクを貼るときには以下のようにURLパスを直接書くことが多いです。

<a href="/hello">Helloページ</a>

しかしこの方法では、もしURLを /hello/greeting に変更したい場合、テンプレートファイル内のすべての /hello を修正しなければなりません。

そこで登場するのが url_for() です。

この関数を使えば、URLではなくルートに対応した「関数名」からURLを自動生成できるため、ルート変更にも柔軟に対応できます。

Pythonコードとテンプレートにおけるurl_forの基本構文と記述例

url_for関数は、Pythonコードとテンプレート内(Jinja2)にそれぞれ以下のように記載します。

from flask import url_for

url_for('関数名')
{{ url_for('関数名') }}

このように、url_for() には関数名を文字列として渡し、必要に応じてパラメータを指定します。

関数名は @app.route() で指定されたURLに対応しています。

例えば、以下のコードを見てみましょう。

from flask import Flask, url_for
app = Flask(__name__)

@app.route('/hello') # もしこのURLにアクセスされたら
def hello():         # Hello関数の定義
    return 'Hello, Flask!'

with app.test_request_context(): # この中でurl_forを使ってURLを出力できる
    print(url_for('hello')) # Hello関数のURLを生成して出力

このコードを実行すると、Hello関数にルーティングされたURL「/hello」が出力されます。

参考資料

app.test_request_context()メソッド

Flaskの app.test_request_context() は、テスト用にリクエストコンテキスト(Request Context)を一時的に作成するためのメソッドです。

これを使うことで、実際にサーバーを起動せずとも url_for()request などの一部Flask機能をスクリプト内で疑似的に利用できるようになります。

また、テンプレートの中でリンクを作るときも url_for() は非常に便利です。

<!-- templates/index.html -->
<a href="{{ url_for('hello') }}">Helloページへ</a>

このように書くことで、ルートに対応するURLが自動的に挿入され、
<a href="/hello">Helloページへ</a> というHTMLが生成されます。

【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

引数を使ったルートに対応するurl_forの記述方法と注意点

もしURLに変数を含める場合は、ルーティング関数と合わせて url_for() にも引数を渡します。

@app.route('/user/<username>') # もしこのURLにアクセスされたら
def user_profile(username):    # 仮引数usernameを持つuser_profile関数の定義
    return f'ユーザー名: {username}'

with app.test_request_context(): # この中でurl_forを使ってURLを出力できる
    print(url_for('user_profile', username='taro')) # user_profil関数のURLを生成して出力

このコードを実行すると、user_profile関数にルーティングされたURL「/user/taro」が出力されます。

テンプレート側でも以下のように使用できます。

<a href="{{ url_for('user_profile', username='taro') }}">Taroのプロフィール</a>

url_for()関数を使用することで、URLパスをテンプレートに直接書かなくてよいため保守性が大幅に向上します。

特にプロジェクトが大きくなってからの変更対応に大きなメリットがあります。

まとめ:url_forを使えばFlaskのリンク管理が圧倒的に楽になる

  • url_for() は関数名からURLを生成するFlaskの組み込み関数
  • Python側でもテンプレート側でも使用可能
  • 引数付きルートも柔軟に対応
  • 直接URLを書かず、保守性の高いコードを実現できる

次回は render_template() を使ってテンプレートにデータを渡す方法を学び、url_for() と組み合わせて実用的なページを作成していきます!

<<前のページ

Flaskの記事一覧

次のページ>>

FAQ|Flaskのurl_for関数の使い方でよくある質問

Q
Q1. url_for関数を使うとき、ルート関数名はどうやって決まるのですか?

基本的に、@app.route()でデコレートされた関数の名前が、そのままurl_for()で指定するルート関数名になります。関数名を変更すると、url_forでの指定も合わせて変える必要があります。

Q
Q2. テンプレート内でurl_forを使う場合、ファイルの拡張子は必要ですか?

url_forでは拡張子は指定不要です。テンプレートからPython側の関数にリンクを飛ばすときには、url_for('関数名')の形式で、HTMLファイルのパスではなくルート関数名を指定します。

Q
Q3. url_forを使って生成されたURLは絶対パスですか?相対パスですか?

url_forが生成するのは絶対パスです。ルート(”/”)からのパスとして扱われるため、異なるディレクトリ構造でもリンク切れしにくく、サイト構造が変わっても安定して使えます。

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

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

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

記事URLをコピーしました