一: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直接能反向獲取視圖函數的鏈接地址,這樣就能省去,動態改變造成的麻煩。