flask之url_for函數


一:url_for函數

  干什么的?傳入函數名,得到函數的路由地址(訪問視圖函數的地址)

from flask import Flask
from flask import url_for

app = Flask(__name__)


@app.route("/")
def index():
    login_url = url_for("login")
    print(login_url)
    return "主頁"


@app.route("/login")
def login():
    return "登錄"

if __name__ == '__main__':
    app.run(debug=True)

 例如:瀏覽器輸入:127.0.0.1:5000/ 顯示主頁   控制台輸出 /login , 可以用它來完成跳轉鏈接的功能:對上面的函數進行修改,加入html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
         <a href="{{ a }}">登錄</a>
</body>
</html>
from flask import Flask
from flask import render_template
from flask import url_for

app = Flask(__name__)


@app.route("/")
def index():
    login_url = url_for("login")
    return render_template("url_for_test.html",a=login_url)


@app.route("/login")
def login():
    return "歡迎進入登錄頁面"

if __name__ == '__main__':
    app.run(debug=True)

 

 

點擊登錄后跳轉到下面界面

 注意:

login_url = url_for("login",_external = True)   這樣會顯示完整的url地址

http://127.0.0.1:5000/login

還可以傳遞參數,對路徑進行拼接

login_url = url_for("login", a=1, _external = True)

http://127.0.0.1:5000/login?a=1  自動將位置參數,拼接成查詢字符串

login_url = url_for("login", name="haha", _external = True)

假如點擊index界面的登錄,不跳轉到登錄界面,而是顯示一張靜態的圖片

@app.route("/")
def index():
    login_url = url_for("static",filename="pic.jpg",_external=True)
    print(login_url)
    return render_template("url_for_test.html",a=login_url)

 

點擊登錄后,瀏覽器跳轉后,顯示了圖片, 控制台輸出:http://127.0.0.1:5000/static/pic.jpg  這種情況瀏覽器沒有將 filenme="pic.jpg" 拼接成

http://127.0.0.1:5000/static?pic.jpg  而是 拼接成 http://127.0.0.1:5000/static/pic.jpg 

原因是:嘗試將參數 filename="pic.jpg" 改為 a="pic.jpg"

報錯:werkzeug.routing.BuildError: Could not build url for endpoint 'static' with values ['a']. Did you forget to specify values ['filename']?

說明:框架會自動分辨,要是以文件進行賦值,必須使用 filename="文件"

三:產生的意義

  在模板中的a標簽手動輸入鏈接地址,進行點擊跳轉,這個很簡答,很容易辦到。

  假如,視圖函數app.route("地址")  地址發生了,改變,那么要鏈接到這個視圖函數,就需要對前端的每個鏈接進行修改,這顯然不方便。

  但是,通過url_for直接能反向獲取視圖函數的鏈接地址,這樣就能省去,動態改變造成的麻煩。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM