Catch-All 路由
Catch-All 路由指用 FastAPI 的 `/{full_path:path}` 这类 `path` 类型路径参数匹配任意层级 URL 的兜底路由,常见于前端 SPA 路由回退、后台管理插件或静态资源兜底处理。文章先区分了默认 `str` 参数只匹配单段路径,而 `path` 会连同斜杠一起接收多段路径,因此 `/api/does-not-exist` 这类未命中精确接口的请求不会直接 404,而可能进入 fallback 处理函数。重点风险在路由注册顺序:FastAPI 按注册先后匹配,若 SQLAdmin 等插件提前注册了 catch-all,后续业务 router 可能被截获,导致本应进入 `/api/v1/**` 的请求落到兜底逻辑。文章还把这种顺序问题和浏览器 CORS 报错关联起来,说明 OPTIONS 预检请求在目标接口未注册、被覆盖或 catch-all 不支持 OPTIONS 时,可能得到 404/405 且缺少跨域响应头,最终表现为跨域失败。处理方式包括先注册所有业务接口,再注册 SQLAdmin 或其他兜底路由,并让 catch-all 使用 `api_route(..., methods=["GET", "POST", "OPTIONS"])` 显式接住 OPTIONS。若不希望业务逻辑处理预检,也可以单独添加 `@router.options("/{full_path:path}")` 返回空响应,保证预检请求有合法 handler。适合正在排查 FastAPI 路由“莫名其妙被命中”、后台插件干扰 API、或未命中接口却显示 CORS error 的后端开发者参考。