介绍
现代 Web 应用程序使用有意义的 URL 来帮助用户。如果页面使用了一个用户可以记住并直接访问的有意义的 URL,用户更有可能喜欢该页面并再次访问。在本实验中,我们将重点介绍如何在 Flask 中实现动态 URL 并将多个规则附加到一个函数上。
路由装饰器
在这一步中,你将使用 route() 装饰器将多个视图函数与多个 URL 绑定。
- 打开
route_decorator.py文件,导入Flask类并创建其实例。
from flask import Flask
app = Flask(__name__)
- 接下来,我们使用
route()装饰器创建两个路由/和/hello,并绑定相应的视图函数,使它们分别返回 Index Page 和 Hello, World。
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
- 创建一个
main入口点,用于在端口 5000 启动 Flask 应用程序,并启用debug模式。
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
- 要运行应用程序,首先在终端中使用以下命令启动 Flask 应用程序:
python3 route_decorator.py
然后打开位于界面顶部的 "Web 5000" 标签,刷新页面,你将看到 Index Page 消息。
对于路由 /hello,你可以直接在 URL 栏中添加后缀 hello。

然后页面将显示 Hello, World 消息。
变量规则
在这一步中,你将通过使用 <variable_name> 标记部分 URL 来添加变量部分。此外,你还可以使用转换器(converter)来指定参数的类型,例如 <converter:variable_name>。
- 打开
variable_rules.py文件,首先导入Flask类和escape,然后创建Flask类的实例。
from flask import Flask
from markupsafe import escape
app = Flask(__name__)
- 在
route()装饰器中,添加<variable_name>和<converter:variable_name>模式,以创建带有变量部分的动态 URL。让视图函数返回格式化字符串。
@app.route('/user/<username>')
def show_user_profile(username):
## 显示该用户的个人资料
return f'User {escape(username)}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
## 显示具有给定 id 的文章,id 为整数
return f'Post {post_id}'
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
## 显示 /path/ 之后的子路径
return f'Subpath {escape(subpath)}'
- 以下是常见转换器类型的表格:
| 类型 | 作用 |
|---|---|
string |
(默认)接受任何不包含斜杠的文本 |
int |
接受正整数 |
float |
接受正浮点数值 |
path |
类似于 string,但也接受斜杠 |
uuid |
接受 UUID 字符串 |
- 创建一个
main入口点,用于在端口 5001 启动 Flask 应用程序,并启用debug模式。
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5001, debug=True)
- 要运行应用程序,首先在新的终端中使用以下命令启动 Flask 应用程序:
python3 variable_rules.py
然后打开位于界面顶部的 "Web 5001" 标签,直接在 URL 栏中添加后缀 user/Alice。

然后页面将显示 User Alice 消息。
- 你还可以对后缀
post/1和path/some/path重复相同的操作。对于后缀post/1,页面将显示消息 Post 1。对于后缀path/some/path,页面将显示消息 Subpath some/path。
重定向行为
在这一步中,你将学习两种规则在使用尾部斜杠时的区别。
- 打开
redirection_behavior.py文件,导入Flask类并创建其实例。
from flask import Flask
app = Flask(__name__)
- 使用
route()装饰器创建一个名为/projects/的路由,并绑定一个名为projects的视图函数。
@app.route('/projects/')
def projects():
return 'The project page'
projects 端点的规范 URL 带有尾部斜杠。它类似于文件系统中的文件夹。如果你访问没有尾部斜杠的 URL(/projects),Flask 会将你重定向到带有尾部斜杠的规范 URL(/projects/)。
- 创建另一个名为
/about的路由,并绑定一个名为about的视图函数。
@app.route('/about')
def about():
return 'The about page'
about 端点的规范 URL 没有尾部斜杠。它类似于文件的路径名。访问带有尾部斜杠的 URL(/about/)会产生 404 Not Found 错误。这有助于保持这些资源的 URL 唯一性,从而帮助搜索引擎避免重复索引同一页面。
- 创建一个
main入口点,用于在端口 5002 启动 Flask 应用程序,并启用debug模式。
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5002, debug=True)
- 要运行应用程序,首先在新的终端中使用以下命令启动 Flask 应用程序:
python3 redirection_behavior.py
然后打开位于界面顶部的 "Web 5002" 标签,直接在 URL 栏中添加后缀 projects。

然后页面将显示 The project page 消息,因为它重定向到了 /projects/ 路由。
将后缀改为 about/ 而不是 projects:

你应该会看到 Not Found 消息,这表示发生了 404 错误。将后缀改为 about,然后页面将正确显示 The about page 消息。
URL 构建
在这一步中,你将使用 url_for() 函数为特定函数构建 URL。它接受函数名作为第一个参数,以及任意数量的关键字参数,每个参数对应 URL 规则中的变量部分。未知的变量部分将作为查询参数附加到 URL 中。
- 打开
url_building.py文件,首先导入Flask类和url_for。同时不要忘记创建Flask类的实例。
from flask import Flask, url_for
app = Flask(__name__)
- 使用
route()装饰器创建三个路由,并定义相应的视图函数。
@app.route('/')
def index():
return 'index'
@app.route('/login')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return f'{username}\'s profile'
- 我们使用
test_request_context()方法来测试url_for()。它告诉 Flask 即使我们在使用 Python shell 时也要表现得像在处理请求一样。
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login', next='/'))
print(url_for('profile', username='John Doe'))
url_for('index')为视图函数index生成 URL,结果为/。url_for('login')为视图函数login生成 URL,结果为/login。url_for('login', next='/')为视图函数login生成 URL,并包含一个额外的查询参数next,结果为/login?next=/。url_for('profile', username='John Doe')为视图函数profile生成 URL,并将username变量设置为John Doe,结果为/user/John%20Doe。
- 在新的终端中直接运行
url_building.py文件:
python3 url_building.py
它应该输出:
/
/login
/login?next=/
/user/John%20Doe
总结
在本实验中,我们学习了多种创建有意义 URL 的方法,这在设计 Web 应用程序时非常重要。通过熟练使用 Flask 的路由功能,你可以创建组织良好且直观的 URL,从而提升用户体验。



