Flask で url_for を使用して動的 URL を作成する
この説明を使用して、url_for() 関数の機能と Flask で動的 URL を作成する方法を学習します。テンプレート内で url_for() を使用する方法も学習します。
Flask の url_for() 関数を使用して動的 URL を作成する
url_for() は、特定のビュー関数に使用される URL を返す Flask の関数です。そして、その URL を使用して、ユーザーをそのページにリダイレクトするか、その URL のみを表示することができます。
実例を示すために、その方法を説明します。それでは、url_for と redirect とともに Flask のインポートを始めましょう。
from flask import Flask, url_for, redirect
これらは、この例で使用する 2つの関数であり、BASE_FUNC() ビューにルートがあります。
@app.route("/")
def BASE_FUNC():
return "Hi there,the base index page"
次に、FIRST_FUNC と呼ばれる別のルートを作成し、別の関数の名前である url_for('BASE_FUNC') を返します。url_for() 関数は関数名を受け取り、url_for() 関数内で渡したその関数のルートを返します。
@app.route("/first")
def FIRST_FUNC():
return url_for("BASE_FUNC")
このルート/first にアクセスしようとすると、BASE_FUNC() 関数に関連付けられた URL が取得されます。これは、そのルートを取得することを意味します。これを保存してサーバーを実行してみましょう。
このエンドポイント/first を入力すると、スラッシュのみが表示されます。

別のルートを作成し、それを関数名 SECOND_FUNC() で/second と呼びましょう。そうすると、url_for('THIRD_FUNC', user_name='Harry') が返されます。Flask では、ルートはパラメーターでも機能するため、文字列となるパラメーターを使用して別のルートを作成する必要があります。
この/third/<string:user_name> のようなルートを作成し、url_for() 関数を渡したときと同じ名前のパラメーターをルート内で使用していることを確認します。次に、THIRD_FUNC() という新しい関数を作成し、同じ名前のパラメーターを渡します。
user_name パラメータを返し、url_for() 関数を使用して他の関数のルートからこの関数にアクセスします。
@app.route("/second")
def SECOND_FUNC():
return url_for("THIRD_FUNC", user_name="Harry")
@app.route("/third/<string:user_name>")
def THIRD_FUNC(user_name):
return "The user name is " + user_name
/second と入力すると、THIRD_FUNC() 関数のルートが得られます。

URL またはリンクを使用して、Flask アプリケーションの特定のページにユーザーをリダイレクトできます。また、URL だけを返す代わりに、ユーザーを特定の URL にリダイレクトできるようになりました。redirect() 関数を呼び出す必要があります。この関数は、ユーザーをリダイレクトする URL を取得します。
redirect(url_for("THIRD_FUNC", user_name="Harry"))
これで、/second を呼び出すと、/third/<string:user_name> ルートの URL が取得され、その 3 番目のルートに送信されます。

次に、Jinja テンプレートを使用してテンプレート内で url_for() を使用する方法を示します。render_template() をインポートし、それを使用して index.html という HTML ファイルをレンダリングします。文字列を返す別のルートを使用します。
@app.route("/")
def BASE_FUNC():
return render_template("index.html")
@app.route("/page")
def Page_FUNC():
return "Hello"
テンプレートフォルダ内に index.html ファイルを作成し、/page ルートへのリンクを追加します。リンクを渡す代わりに、url_for() 内に Page_FUNC を渡します。
<a href="{{url_for('Page')}}">Page</a>
ページを保存して更新しましょう。

ここで、もう少し複雑にします。パラメータとなる/page とともに渡すことができる動的要素を追加します。テンプレート内でこのパラメーターを使用して、2 番目のキーワード引数をそのルート関数に渡す必要のある引数にすることができます。
この場合、user_name は Josh と同じになります。
<a href="{{ url_for('Page_FUNC',user_name='Josh') }}">Page</a>
出力:

完全な Python ソースコード:
from flask import Flask, url_for, render_template
app = Flask(__name__)
# @app.route("/")
# def BASE_FUNC():
# return "Hi there,the base index page"
# @app.route("/first")
# def FIRST_FUNC():
# return url_for('BASE_FUNC')
# @app.route("/second")
# def SECOND_FUNC():
# return redirect(url_for('THIRD_FUNC', user_name='Harry'))
# @app.route("/third/<string:user_name>")
# def THIRD_FUNC(user_name):
# return "The user name is " + user_name
@app.route("/")
def BASE_FUNC():
return render_template("index.html")
@app.route("/page/<string:user_name>")
def Page_FUNC(user_name):
return "Hello " + user_name
if __name__ == "__main__":
app.run(debug=True)
完全な HTML ソースコード:
<html>
<head>
<body>
<h1>Hi User, this is Base page</h1>
<a href="{{ url_for('Page_FUNC',user_name='Josh') }}">Page</a>
</body>
</head>
</html>
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn