介绍
现代 Web 应用程序使用有意义的 URL 来帮助用户。如果页面使用了一个用户可以记住并直接访问的有意义的 URL,用户更有可能喜欢该页面并再次访问。在本实验中,我们将重点介绍如何在 Flask 中实现动态 URL 并将多个规则附加到一个函数上。
现代 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)
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)
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)
python3 redirection_behavior.py
然后打开位于界面顶部的 "Web 5002" 标签,直接在 URL 栏中添加后缀 projects
。
然后页面将显示 The project page 消息,因为它重定向到了 /projects/
路由。
将后缀改为 about/
而不是 projects
:
你应该会看到 Not Found 消息,这表示发生了 404 错误。将后缀改为 about
,然后页面将正确显示 The about page 消息。
在这一步中,你将使用 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,从而提升用户体验。