现在位置: 首页 > Flask 教程 > 正文

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

如果默认值路由与带变量的路由都存在,访问带默认值的 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)}"