Flask で url_for を使用して動的 URL を作成する

Salman Mehmood 2022年8月18日
Flask で url_for を使用して動的 URL を作成する

この説明を使用して、url_for() 関数の機能と Flask で動的 URL を作成する方法を学習します。テンプレート内で url_for() を使用する方法も学習します。

Flask の url_for() 関数を使用して動的 URL を作成する

url_for() は、特定のビュー関数に使用される URL を返す Flask の関数です。そして、その URL を使用して、ユーザーをそのページにリダイレクトするか、その URL のみを表示することができます。

実例を示すために、その方法を説明します。それでは、url_forredirect とともに 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 を入力すると、スラッシュのみが表示されます。

Flask url_for 出力 1

別のルートを作成し、それを関数名 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() 関数のルートが得られます。

Flask url_for 出力 2

URL またはリンクを使用して、Flask アプリケーションの特定のページにユーザーをリダイレクトできます。また、URL だけを返す代わりに、ユーザーを特定の URL にリダイレクトできるようになりました。redirect() 関数を呼び出す必要があります。この関数は、ユーザーをリダイレクトする URL を取得します。

redirect(url_for("THIRD_FUNC", user_name="Harry"))

これで、/second を呼び出すと、/third/<string:user_name> ルートの URL が取得され、その 3 番目のルートに送信されます。

Flask url_for 出力 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>

ページを保存して更新しましょう。

Flask url_for 出力 4

ここで、もう少し複雑にします。パラメータとなる/page とともに渡すことができる動的要素を追加します。テンプレート内でこのパラメーターを使用して、2 番目のキーワード引数をそのルート関数に渡す必要のある引数にすることができます。

この場合、user_nameJosh と同じになります。

<a href="{{ url_for('Page_FUNC',user_name='Josh') }}">Page</a>

出力:

Flask url_for 出力 5

完全な 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>
著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

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