在 Flask 中使用 url_for 建立動態 URL

Salman Mehmood 2022年7月18日
在 Flask 中使用 url_for 建立動態 URL

通過這個解釋,我們將瞭解 url_for() 函式的作用以及我們如何在 Flask 中建立動態 URL。我們還將學習如何在模板中使用 url_for()

藉助 Flask 中的 url_for() 函式建立動態 URL

url_for() 是 Fl​​ask 中的一個函式,它返回用於特定檢視函式的 URL。使用該 URL,你可以將使用者重定向到該頁面或僅顯示該 URL。

為了演示,我們將向你展示我們如何做到這一點。所以,讓我們開始匯入 Flask 以及 url_forredirect

from flask import Flask, url_for, redirect

這是我們將在本例中使用的兩個函式,然後我們將在 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 並將我們傳送到第三個路由。

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 一起傳遞。我們將在模板中使用此引數,以便第二個關鍵字引數可以是需要傳遞給該路由函式的任何引數。

在我們的例子中,user_name 將等於 Josh

<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 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