URL 定义路由 API
Flask 提供三种方式定义路由规则:@app.route() 装饰器、add_url_rule() 方法、直接操作 url_map。
URL 变量转换器
| 转换器 | 语法 | 匹配规则 | Python 类型 |
|---|---|---|---|
| string | <string:name> 或 <name> | 不含 / 的任意文本(默认) | str |
| int | <int:id> | 正整数 | int |
| float | <float:value> | 正浮点数 | float |
| path | <path:filepath> | 任意文本(包含 /) | str |
| any | <any(a,b,c):item> | 匹配列表中任一值 | str |
| uuid | <uuid:id> | 标准 UUID 格式 | str |
add_url_rule 参数
| 参数 | 类型 | 说明 |
|---|---|---|
| rule | str | URL 规则字符串,如 "/user/<username>" |
| endpoint | str | 端点名,默认使用函数名。url_for 以此引用路由 |
| view_func | callable | 视图函数。可不传,稍后存入 view_functions 字典 |
| defaults | dict | URL 变量的默认值。如 defaults={"page": 1} |
| subdomain | str | 子域名匹配。需启用 subdomain_matching |
| methods | list | 允许的 HTTP 方法。默认 ["GET"](HEAD 和 OPTIONS 自动添加) |
| host | str | 主机名匹配。需启用 host_matching |
尾斜线行为
| 规则 | 访问不带 / | 访问带 / |
|---|---|---|
| @app.route("/projects/") | 308 重定向到 /projects/ | 正常访问 |
| @app.route("/about") | 正常访问 | 404 Not Found |
默认值路由
通过 defaults 参数实现可选的 URL 变量:
实例
# 两个 URL 指向同一函数,/users/ 等同于 /users/page/1
@app.route("/users/", defaults={"page": 1})
@app.route("/users/page/<int:page>")
def show_users(page):
return f"Showing page {page}"
# 访问 /users/ → page=1
# 访问 /users/page/3 → page=3
@app.route("/users/", defaults={"page": 1})
@app.route("/users/page/<int:page>")
def show_users(page):
return f"Showing page {page}"
# 访问 /users/ → page=1
# 访问 /users/page/3 → page=3
如果默认值路由与带变量的路由都存在,访问带默认值的 URL 会被 308 重定向到简化形式。
自定义转换器
实例
from werkzeug.routing import BaseConverter
# 定义自定义类型转换器
class ListConverter(BaseConverter):
"""匹配逗号分隔的列表,如 /tags/python,flask"""
def to_python(self, value):
return value.split(",")
def to_url(self, values):
return ",".join(values)
# 注册到 url_map
app.url_map.converters["list"] = ListConverter
# 使用自定义转换器
@app.route("/tags/<list:tags>")
def show_tags(tags):
# tags 为 Python 列表:["python", "flask", "web"]
return f"Tags: {', '.join(tags)}"
# 定义自定义类型转换器
class ListConverter(BaseConverter):
"""匹配逗号分隔的列表,如 /tags/python,flask"""
def to_python(self, value):
return value.split(",")
def to_url(self, values):
return ",".join(values)
# 注册到 url_map
app.url_map.converters["list"] = ListConverter
# 使用自定义转换器
@app.route("/tags/<list:tags>")
def show_tags(tags):
# tags 为 Python 列表:["python", "flask", "web"]
return f"Tags: {', '.join(tags)}"
