一: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)

flask之url_for函数-风君雪科技博客 

点击登录后跳转到下面界面

flask之url_for函数-风君雪科技博客

 注意:

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=”文件”

flask之url_for函数-风君雪科技博客

三:产生的意义

  在模板中的a标签手动输入链接地址,进行点击跳转,这个很简答,很容易办到。

  假如,视图函数app.route(“地址”)  地址发生了,改变,那么要链接到这个视图函数,就需要对前端的每个链接进行修改,这显然不方便。

  但是,通过url_for直接能反向获取视图函数的链接地址,这样就能省去,动态改变造成的麻烦。