Flask - 变量规则
Flask – 路由中的变量规则
Section titled “Flask – 路由中的变量规则”Flask 允许你在 URL 路由中定义动态部分。这些变量部分捕获 URL 的片段,并将它们作为参数传递给你的视图函数。这对于创建表示特定资源的 URL 至关重要,例如用户个人资料、博客文章或产品详情。
定义变量部分
Section titled “定义变量部分”通过将变量名放在尖括号中标记路由规则中的变量部分:<variable_name>。
from flask import Flask
app = Flask(__name__)
# <username> 部分是变量@app.route('/user/<username>')def show_user_profile(username): # 从 URL 捕获的值作为 'username' 参数传递 return f'User Profile: {username}'
if __name__ == '__main__': app.run(debug=True)如果你运行此应用程序并导航到以下 URL:
http://localhost:5000/user/Alice-> 显示 ‘User Profile: Alice’http://localhost:5000/user/Bob-> 显示 ‘User Profile: Bob’
show_user_profile 函数接收 /user/ 后 URL 中的任何字符串作为其 username 参数。
使用转换器(Converters)
Section titled “使用转换器(Converters)”默认情况下,变量部分被视为字符串。但是,你可以指定一个*转换器(converter)*在将变量传递给视图函数之前对其进行处理。这对于类型检查和确保 URL 段匹配预期格式非常有用。
语法:<converter:variable_name>
常用转换器(Converters):
Section titled “常用转换器(Converters):”| 转换器 | 描述 |
|---|---|
| string | (默认)接受任何不带斜杠的文本。 |
| int | 接受正整数。 |
| float | 接受正浮点数。 |
| path | 类似 string,但也接受斜杠(用于捕获文件路径)。 |
| uuid | 接受 UUID 字符串。 |
转换器示例:
Section titled “转换器示例:”from flask import Flask, escape
app = Flask(__name__)
# 期望 post_id 是整数@app.route('/post/<int:post_id>')def show_post(post_id): # 这里保证 post_id 是整数 return f'Showing Post Number: {post_id}'
# 期望 version 是浮点数@app.route('/version/<float:version>')def show_version(version): # 这里保证 version 是浮点数 return f'Version: {version:.2f}' # 格式化浮点数用于显示
# 期望是路径结构@app.route('/files/<path:subpath>')def show_subpath(subpath): # subpath 可以包含斜杠,例如 'docs/images/logo.png' # 如果渲染用户提供的路径,请使用 escape() 进行安全处理 return f'Showing File Path: {escape(subpath)}'
if __name__ == '__main__': app.run(debug=True)如果你尝试访问与转换器类型不匹配的 URL(例如,当期望 int 时访问 /post/abc),Flask 将返回 404 Not Found 错误。
规范 URL 和末尾斜杠
Section titled “规范 URL 和末尾斜杠”Flask 的路由基于 Werkzeug,它会注意 URL 规则中的末尾斜杠:
- 带有末尾斜杠的规则(例如
@app.route('/projects/')):这定义了以斜杠结尾的规范(canonical) URL。访问不带斜杠的 URL (/projects) 将导致 Flask 将浏览器重定向到带斜杠的规范 URL (/projects/)。 - 不带末尾斜杠的规则(例如
@app.route('/about')):这定义了不带斜杠的规范 URL。访问带末尾斜杠的 URL (/about/) 将导致 404 Not Found 错误。
此行为有助于确保资源的 URL 唯一,这有利于搜索引擎优化,并防止重复内容问题。
from flask import Flask
app = Flask(__name__)
@app.route('/features/') # 带有末尾斜杠的规范 URLdef show_features(): return 'List of Features'
@app.route('/contact') # 不带末尾斜杠的规范 URLdef contact_us(): return 'Contact Information'
if __name__ == '__main__': app.run(debug=True)
# 行为:# /features/ -> OK (200)# /features -> Redirects to /features/ (308)# /contact -> OK (200)# /contact/ -> Not Found (404)