在 Flask 中使用 url_for 建立動態 URL
通過這個解釋,我們將瞭解 url_for()
函式的作用以及我們如何在 Flask 中建立動態 URL。我們還將學習如何在模板中使用 url_for()
。
藉助 Flask 中的 url_for()
函式建立動態 URL
url_for()
是 Flask 中的一個函式,它返回用於特定檢視函式的 URL。使用該 URL,你可以將使用者重定向到該頁面或僅顯示該 URL。
為了演示,我們將向你展示我們如何做到這一點。所以,讓我們開始匯入 Flask 以及 url_for
和 redirect
。
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
,我們只會得到一個斜槓:
讓我們建立另一個路由並使用函式名稱 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 並將我們傳送到第三個路由。
現在我們將向你展示如何使用 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
一起傳遞。我們將在模板中使用此引數,以便第二個關鍵字引數可以是需要傳遞給該路由函式的任何引數。
在我們的例子中,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