FastAPI中Path参数正则约束需写在路径字符串中,格式为{param_name:regex},如@app.get("/item/{item_id:\d+}");正则在路由匹配阶段生效,不满足则直接404,且不可含捕获组。
FastAPI 原生支持在 Path 参数中嵌入正则表达式,但不是靠 Python 的 re 模块手动校验,而是通过路径参数的「类型注解 + 正则语法」直接定义规则。关键在于:正则写在路径字符串里,不是写在函数参数的 regex=... 里。
错误做法是试图在 Path(...) 里传正则对象或字符串——FastAPI 不识别这种用法。正确方式是把正则写进路径模板,用 {param_name:regex} 格式:
@app.get("/item/{item_id:\d+}")
def read_item(item_id: int):
return {"item_id": item_id}
\d+ 是正则表达式,匹配一个或多个数字;整个 {item_id:\d+} 表示该路径段只接受纯数字item_id 的类型注解仍需写(如 int),FastAPI
/item/abc,直接返回 404(不进函数);如果是 /item/123,才调用函数并转成 int
(),否则报错;只支持基本语法,如 [a-z]、\w+、[0-9]{4}
实际开发中高频用到的几种模式:
/user/{username:[a-zA-Z]+} —— 避免数字开头或混入符号/api/v{version:[0-9]\.[0-9]} → 匹配 v1.2,但不匹配 v10.20
/file/{sha256:[a-f0-9]{64}} —— 精确 64 位小写 hex/docs/{section:(?:api|user|admin)?} —— 注意非捕获组 (?:...) 写法,避免括号被误解析正则没起作用,大概率是以下原因:
{item_id\d+}(缺 :)→ FastAPI 当作普通字符串字面量处理. 没写成 \. → 导致匹配行为异常/item/{item_id} 和 /item/{item_id:\d+} 同时存在,前者会优先匹配所有输入,后者永远不触发正则限制发生在路由匹配阶段,早于依赖注入和参数校验,所以它既是安全边界,也是性能开关——写得太松会导致无效请求穿透到后续逻辑。