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