构造URL
在 3.3 节中执行 redirect("/login") 函数,让页面跳转到登录页面,这里是直接把 /login 这个 URL 硬编码进去的,对于项目健壮性不太友好,更好的方式应该是通过 url_for 函数来动态地构造 URL。url_for 接收视图函数名作为第 1 个参数,以及其他 URL 定义时的参数,如果还添加了其他参数,则会添加到 URL 的后面作为查询字符串参数。这里以博客详情的 URL 为例来讲解 url_for 函数的使用,示例代码如下。
from flask import Flask, url_for
app = Flask(__name__)
@app.route("/blog/<int:blog_id>")
def blog_detail(blog_id):
return "您查找的博客id为:%s" % blog_id
@app.route("/urlfor")
def get_url_for():
url = url_for("blog_detail", blog_id=2, user="admin")
return url
在 get_url_for 视图函数中使用了 url_for 函数,把函数名 blog_detail 作为第 1 个参数,因为 blog_detail 的 URL 需要接收一个 blog_id 参数,因此把 blog_id 也传给了 url_for 函数。除此之外,还添加了一个 user 参数,因为 user 参数不是必需的,所以在构建成 URL 后,会把 user 作为查询字符串参数拼接上去。在浏览器中访问 /urlfor,可以看到如图 3-13 所示的效果。

Figure 1. 图3-13 访问/urlfor
相比在代码中硬编码 URL,使用 url_for 函数来动态地构建 URL 有以下两点好处。
-
URL 是对外的,可能会经常变化,但是视图函数不会经常变化。如果直接把 URL 硬编码,若后期 URL 改变了,凡是硬编码了这个 URL 的代码都需要修改,费时费力。
-
URL 在网络之间通信的过程中,需要把一些特殊字符包括中文等进行编码,如 URL 中包含了特殊字符,用 url_for 函数会自动进行编码,省时省力。