路由跳转
在 Flask 中,路由跳转是页面之间的导航和请求处理的核心部分。今天我们将一起探索如何在 Flask 应用中通过路由实现页面跳转,使用 url_for() 函数和 redirect() 方法来完成这一过程。
简介
在 Flask 中,路由跳转是实现页面间导航和处理请求的核心部分。通过定义路由(URL 路径)与视图函数的对应关系,Flask 可以根据客户端请求的 URL 调用相应的视图函数,并返回响应。
我们在 Flask 中定义了路由,它通过 URL 路径和视图函数之间的关联来处理请求。客户端发起请求时,Flask 会根据请求的 URL 路径来决定调用哪个视图函数,并返回相应的响应。但是,除了直接访问某个路由之外,有时我们需要在不同的页面之间进行跳转,或者在完成某个操作后跳转到另一个页面。这就是路由跳转的应用场景。
应用场景
- 场景:
- 假设在新增信息页面,完成新增操作之后需要跳转到展示页面。
- 展示页面是个动态页面,它的逻辑是,如果有参数,则展示相关参数的结果,如果没有参数,则展示所有的信息。
- 解决:
- 使用
url_for()
生成 url ,再使用redirect()
方法完成路径的重定向。实现当完成添加的逻辑后,跳转展示的逻辑。
- 使用
假设我们有一个页面用来新增信息。当用户完成新增操作后,我们希望自动跳转到一个展示页面,显示刚才添加的信息。如果展示页面有不同的参数,页面内容就会有所不同——如果没有参数,展示所有信息;如果有参数,则展示相应的内容。在这种情况下,我们可以使用 url_for() 来生成目标页面的 URL,然后结合 redirect() 方法实现页面的跳转。这样就能确保操作完成后,用户自动跳转到正确的页面。
使用 url_for()
函数的优点
相比使用相对路径,url_for()
函数有以下几个优点:
-
比直接使用 URL 的描述性更好。
-
可以只在一个地方改变 URL ,而不用到处乱找,可维护性好。
-
url_for()
函数生成的 URL 创建会处理特殊字符的转义和 Unicode 数据,比较直观。 -
url_for()
函数生成的路径总是绝对路径,可以避免使用相对路径导致的一些问题。 -
如果应用是放在 URL 根路径之外的地方(如在
/myapplication
中,不在/
中),url_for()
也可以妥善处理。
为什么我们要使用 url_for() 来生成路由的 URL 地址呢?与直接使用硬编码的路径相比,url_for() 有几个显著的优势。它比直接写 URL 更加描述性。你不需要关心具体的路径,只需使用视图函数名,Flask 会自动生成正确的 URL。你只需要在一个地方修改 URL,当应用需要调整路由时,url_for() 会自动更新,避免了到处修改的麻烦,提升了可维护性。它会自动处理特殊字符的转义和 Unicode 编码,使生成的 URL 更加直观和安全。url_for() 总是返回绝对路径,这避免了使用相对路径时可能出现的问题。如果你的应用被部署到子目录下(比如 /myapplication),url_for() 会自动处理这种情况,确保 URL 正确。
url_for()
的用法
url_for()
可以根据视图函数名生成视图的路由地址。- 语法:
url_for(视图函数名, *)
- 视图地址:str 类型,可以是视图函数名,也可以是由蓝图和视图函数组成的地址。
*
:允许传递参数。
- 用法:
- 用法一:
url_for(视图函数名)
- 用法二:
url_for("蓝图名.视图函数名")
- 用法一:
url_for() 函数的作用是根据视图函数的名字来生成该视图对应的 URL 地址。你可以传递视图函数名作为参数,甚至在使用蓝图时,结合蓝图名一起使用。它的基本语法是 url_for(视图函数名, *参数),其中参数可以是任何需要传递给视图函数的内容。比如,使用 url_for() 来获取某个视图函数的 URL 时,可以这样写:url_for(视图函数名):直接根据视图函数生成路由地址。url_for("蓝图名.视图函数名"):如果使用蓝图,还需要指定蓝图的名字。
路由生成
使用 url_for(视图函数名)
即可返回对应视图函数的 url。
from flask import Flask, url_for
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route("/helloworld")
def hello():
return url_for("hello")
# 运行应用程序
if __name__ == '__main__':
app.run(debug=True, port=5055)
看一下具体的代码示例,我们使用 url_for("hello") 来获取 hello 视图函数的 URL。我们在视图函数中返回这个 URL 地址,就能得到 Flask 自动生成的路径。启动 Flask 应用后,当你访问 /helloworld 路由时,Flask 会自动返回 hello 视图函数对应的 URL。
可以看到响应返回了生成的路由地址。
你可以看到,响应中返回的 URL 就是 hello 视图函数的路由路径,Flask 自动帮我们生成了这个地址。
蓝图路由生成
使用 url_for("蓝图名.视图函数名")
即可返回对应视图函数的 url。
from flask import Flask, Blueprint, url_for
# 创建 Flask 应用程序实例
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(index_api)
app.register_blueprint(login_api)
app.run(debug=True, port=5055)
在使用蓝图时,url_for() 的用法类似,但需要包含蓝图名。这样即使不同蓝图中有相同的视图函数名,Flask 也能正确区分。来看一个蓝图的示例。在这个例子中,login 蓝图中的 login() 视图函数会通过 url_for("index.index") 来跳转到 index 蓝图中的 index() 视图。
页面中可以看到响应的内容中返回了生成的路由地址。
从响应中可以看到,Flask 自动生成了正确的 URL 路径。
路由跳转
重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置。
可以在生成视图的路由地址后,使用 redirect()
方法实现路由的跳转。
除了生成 URL,我们还可以进行实际的页面跳转。这就是所谓的重定向(Redirect)。重定向的核心就是将用户请求从一个页面重定向到另一个页面。redirect() 函数就是用来完成这种跳转的,它会接受一个目标 URL 地址,或者是通过 url_for() 生成的路由地址,从而实现跳转。
redirect()
使得一个路由地址 A 与另一个路由地址 B 联系起来,执行 A 的时候会跳转执行 B。- 语法:
flask.redirect(location, code=302, Response=None)
- location 是一个链接地址,可以使用
url_for()
函数得到,也可以是静态文件地址。 - code HTTP 协议中的一个状态码。
- Response 是一个响应类。
- location 是一个链接地址,可以使用
- 用法:
- 用法一:
redirect(url地址)
- 用法二:
redirect(路由地址)
(可以结合 url_for 使用)
- 用法一:
from flask import Flask, Blueprint, url_for, redirect
# 创建 Flask 应用程序实例
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")
return redirect(url_for("index.index"))
@index_api.route("")
def index():
print("首页")
return {"code": 0, "msg": "success"}
# 运行应用程序
if __name__ == '__main__':
app.register_blueprint(index_api)
app.register_blueprint(login_api)
app.run(debug=True, port=5055)
redirect() 可以将用户的请求从一个路由 A 跳转到另一个路由 B。它的语法是:flask.redirect(location, code=302, Response=None),其中 location 是目标 URL 地址(可以是由 url_for() 生成的地址),code 是 HTTP 状态码,Response 是响应类,通常不需要手动设置。例如,在 login() 视图中,成功登录后,我们可以使用 redirect() 跳转到首页。
说明已经成功的跳转到了 index 路由。
我们可以看到,访问 login 路由时,系统成功地跳转到了 index 路由。
使用 url_for 生成动态路由的 URL
想在 Flask 应用的其他地方(比如模板或视图函数中)生成指向该动态路由的 URL,可以使用 url_for,并传递动态参数。
from flask import Flask, url_for, redirect
app = Flask(__name__)
@app.route('/')
def index():
# 假设我们要跳转到 post_id 为 123 的页面
post_id = 123
# 生成动态 URL
return redirect(url_for('show_post', post_id=post_id))
# 动态路由
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'
if __name__ == '__main__':
app.run()
如果想在 Flask 应用的其他地方(比如模板或视图函数中)生成指向该动态路由的 URL,可以使用 url_for,并传递动态参数。比如在这个例子中,我们可以让 index 视图函数的返回自动跳转到动态路由 show_post 上。这时就需要在 url_for 函数的第二个参数使用关键字传参的方式,使用动态路由中需要的参数名称作为 key,然后把需要的值传递进去就可以。这样设置之后,启动服务,访问服务根路由可以看到,返回的数据就是 Post 123。
总结
- 路由生成
- 路由跳转
我们学习了如何使用 url_for() 函数来动态生成路由 URL,这使得我们能够更方便地管理路由。通过 redirect() 方法实现了从一个页面跳转到另一个页面,增强了应用的交互性。掌握这些技术后,你就能在 Flask 中轻松处理页面之间的跳转和路由生成了。