路由跳转url_for()

一、应用场景

  • 场景:

    • 假设在新增信息页面,完成新增操作之后需要跳转到展示页面;
    • 展示页面是个动态页面,若有参数则展示相关结果,若无参数则展示全部信息。
  • 解决:

    • 使用url_for生成URL,再使用redirect()方法完成路径的重定向。实现当完成添加的逻辑后,展示跳转的逻辑。

二、使用url_for()函数的优点

  • 相比使用相对路径,url_for()函数有以下几个优点:
  1. 比直接使用URL的描述性更好;

  2. 可以只在一个地方改变URL,而不用到处乱找,可维护性好;

  3. url_for()函数生成的URL创建会处理特殊字符的转移和Unicode数据,比较直观;

  4. url_for()函数生成的路径总是绝对路径,可以避免使用相对路径导致的一些问题;

  5. 如果应用是放在URL根路径之外的地方(如在/myapplication中,不在/中),url_for()也可以妥善处理。

三、url_for()的用法

  • url_for()可以根据视图函数名生成视图的路由地址;

  • 语法:url_for(视图函数名, *)

    • 视图地址:str类型,可以是视图函数名,也可以是由蓝图和视图函数组成的地址;

    • *:允许传递参数。

  • 用法:

    • 用法一:url_for(视图函数名)

    • 用法二:url_for(“蓝图名.视图函数名”)

3.1 路由生成

from flask import Flask, url_for

app = Flask(__name__)


@app.route("/world/")
def hello():
    return url_for("hello")


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

3.2 蓝图路由生成

from flask import Flask, Blueprint, url_for

app = Flask(__name__)

login_api = Blueprint("login", __name__, url_prefix="/login")
index_api = Blueprint("index", __name__, url_prefix="/index")

@login_api.route("")
def login():
    print("登录成功,跳转到首页。。")
    return url_for("index.index")

@index_api.route("")
def index():
    print("这里是首页")
    return {"code":0, "msg":"success"}


if __name__ == '__main__':
    app.register_blueprint(login_api)
    app.register_blueprint(index_api)
    app.run(port=5050, debug=True)

三、路由跳转

  • 重定向Redirect就是通过各种方法,将各种网络请求重新定个方向转到其它位置。

  • 可以在生成视图的路由地址后,使用redirect()方法实现路由的跳转。

    • redirect()使得一个路由地址A,与另一个路由地址B联系起来,执行A时会跳转执行B。

    • 语法:flask.redirect(location, code=302, Response=None)

      • location:一个连接地址,可以使用url_for()函数得到,也可以是静态文件地址;

      • code:HTTP协议中的一个状态码;

      • Reponse:一个响应类。

    • 用法:

      • 用法一:redirect(url地址)
      • 用法二:redirect(路由地址)(可以结合url_for()使用)
from flask import Flask, Blueprint, url_for, redirect

app = Flask(__name__)

login_api = Blueprint("login", __name__, url_prefix="/login")
index_api = Blueprint("index", __name__, url_prefix="/index")

@login_api.route("")
def login():
    print("登录成功,跳转到首页。。")
    return redirect(url_for("index.index"))

@index_api.route("")
def index():
    print("这里是首页")
    return {"code":0, "msg":"success"}

if __name__ == '__main__':
    app.register_blueprint(login_api)
    app.register_blueprint(index_api)
    app.run(port=5050, debug=True)

示例:login成功跳转到index路由。