路由

路由用于将 URL 与视图函数绑定,决定用户访问某个路径时由哪段代码处理。Flask 通过装饰器声明路由,是构建应用的第一步。

基础用法

@app.route("/")
def index():
    return "Index"

@app.get("/hello")        # 等价于 @app.route("/hello", methods=["GET"])
def hello():
    return "Hello"

@app.post("/submit")      # 仅接受 POST
def submit():
    return "Submitted"

@app.route("/items", methods=["GET", "POST"])  # 一个视图处理多个方法
def items():
    ...

@app.get / @app.post / @app.put / @app.delete / @app.patch 是 Flask 2.0+ 提供的快捷装饰器。未声明的方法访问该路径时会返回 405 Method Not Allowed。

URL 参数与转换器

URL 中用 <变量名> 捕获路径片段,并可指定类型转换器:

@app.get("/user/<username>")
def profile(username):
    return f"User: {username}"

@app.get("/post/<int:post_id>")
def post_detail(post_id):
    return f"Post #{post_id}"          # post_id 已是 int

@app.get("/price/<float:amount>")
def price(amount):
    return f"{amount:.2f}"

@app.get("/files/<path:subpath>")      # path 允许包含斜杠
def files(subpath):
    return subpath

内置转换器:string(默认,不含斜杠)、intfloatpath(含斜杠)、uuid。类型不匹配时直接返回 404,无需手动校验。

构造 URL:url_for

不要在代码和模板里硬编码 URL,使用 url_for() 以端点名反向生成:

from flask import url_for

url_for("index")                      # "/"
url_for("post_detail", post_id=123)   # "/post/123"
url_for("profile", username="alice", tab="repos")  # 多余参数变查询串:/user/alice?tab=repos
url_for("static", filename="css/style.css")        # 静态文件

端点名默认是视图函数名;蓝图中的端点要加蓝图名前缀,如 url_for("blog.list_posts")

重定向与 abort

from flask import redirect, url_for, abort

@app.get("/old")
def old():
    return redirect(url_for("index"), code=301)   # 默认 302

@app.get("/admin")
def admin():
    if not current_user_is_admin():
        abort(403)                                 # 立即中断并返回错误页
    ...

尾部斜杠的行为

  • 路由定义为 /projects/(带尾斜杠):访问 /projects 会被 308 重定向到 /projects/
  • 路由定义为 /about(不带尾斜杠):访问 /about/ 直接 404。

保持团队内风格统一可以避免重定向带来的额外请求。

自定义转换器

需要正则或特殊匹配时,可以注册自定义转换器:

from werkzeug.routing import BaseConverter

class SlugConverter(BaseConverter):
    regex = r"[a-z0-9]+(?:-[a-z0-9]+)*"

app.url_map.converters["slug"] = SlugConverter

@app.get("/article/<slug:slug>")
def article(slug):
    return slug

常见注意事项

  • 路由按注册顺序与具体程度匹配,避免定义相互重叠、含义模糊的路径。
  • 视图函数名(端点名)必须唯一,重复会在启动时报错。
  • flask routes 命令可以列出当前应用的全部路由,便于排查。