当前位置: 首页 > news >正文

FastAPI 路径参数

FastAPI 路径参数(Path Parameters)

1. 基础用法

fromfastapiimportFastAPI app=FastAPI()@app.get("/items/{item_id}")asyncdefread_item(item_id:int):return{"item_id":item_id}
# 请求curlhttp://localhost:8000/items/42# 响应: {"item_id": 42}# 类型不匹配时自动返回 422 错误curlhttp://localhost:8000/items/foo# {"detail":[{"loc":["path","item_id"],"msg":"value is not a valid integer","type":"type_error.integer"}]}

路径参数的类型由函数参数的类型注解决定,FastAPI 自动解析和验证。


2. 路径参数类型

# 整数@app.get("/items/{item_id}")asyncdefread_item(item_id:int):return{"item_id":item_id}# 字符串@app.get("/users/{username}")asyncdefread_user(username:str):return{"username":username}# 浮点数@app.get("/measurements/{value}")asyncdefread_measurement(value:float):return{"value":value}# 枚举(限定可选值)fromenumimportEnumclassModelName(str,Enum):alexnet="alexnet"resnet="resnet"lenet="lenet"@app.get("/models/{model_name}")asyncdefget_model(model_name:ModelName):ifmodel_nameisModelName.alexnet:return{"model":model_name,"message":"Deep Learning"}return{"model":model_name}# Path 类型(Path 也是 str 的子类,支持枚举)classItemType(str,Enum):book="book"electronics="electronics"@app.get("/catalog/{item_type}")asyncdefget_catalog(item_type:ItemType):return{"item_type":item_type}

3. Path() 参数验证

fromfastapiimportPathfromtypingimportOptional@app.get("/items/{item_id}")asyncdefread_item(item_id:int=Path(...,# 必填(路径参数本身就是必填的)title="项目ID",description="项目的唯一标识符",gt=0,# 大于 0le=1000000,# 小于等于 1000000),):return{"item_id":item_id}

数值约束

约束含义适用类型
gt大于int,float
ge大于等于int,float
lt小于int,float
le小于等于int,float
multiple_of必须是某数的倍数int,float
# 页码:1~1000 之间的整数@app.get("/pages/{page}")asyncdefread_page(page:int=Path(ge=1,le=1000),):return{"page":page}# 价格:大于 0 的浮点数,精确到 0.01@app.get("/price/{price}")asyncdefread_price(price:float=Path(gt=0,multiple_of=0.01),):return{"price":price}

字符串约束

约束含义
min_length最小长度
max_length最大长度
pattern正则匹配
@app.get("/users/{username}")asyncdefread_user(username:str=Path(min_length=3,max_length=20,pattern="^[a-zA-Z0-9_-]+$",# 正则:仅允许字母数字下划线连字符),):return{"username":username}

4. 多个路径参数

@app.get("/users/{user_id}/items/{item_id}")asyncdefread_user_item(user_id:int=Path(gt=0),item_id:int=Path(gt=0),):return{"user_id":user_id,"item_id":item_id}
curlhttp://localhost:8000/users/5/items/42# {"user_id": 5, "item_id": 42}

5. 路径参数顺序规则

固定路径必须在参数路径之前声明,否则会被参数路径提前匹配:

# ❌ 错误:/users/me 会被 /users/{user_id} 捕获,user_id="me"@app.get("/users/{user_id}")asyncdefread_user(user_id:str):...@app.get("/users/me")asyncdefread_me():...# ✅ 正确:固定路径在前@app.get("/users/me")asyncdefread_me():...@app.get("/users/{user_id}")asyncdefread_user(user_id:str):...

6. 路径参数 + 查询参数

fromtypingimportOptional@app.get("/items/{item_id}")asyncdefread_item(item_id:int=Path(gt=0),# 路径参数q:Optional[str]=Query(default=None),# 查询参数short:bool=Query(default=False),# 查询参数):item={"item_id":item_id}ifq:item.update({"q":q})ifnotshort:item.update({"description":"A long description"})returnitem
curl"http://localhost:8000/items/5?q=phone&short=true"# {"item_id":5,"q":"phone"}curl"http://localhost:8000/items/5"# {"item_id":5,"description":"A long description"}

7. 路径参数 + 请求体

frompydanticimportBaseModelclassItemUpdate(BaseModel):name:strprice:float@app.put("/items/{item_id}")asyncdefupdate_item(item_id:int=Path(gt=0),item:ItemUpdate=None,# 请求体):return{"item_id":item_id,"item":item}

8. 参数声明顺序

Python 要求带默认值的参数必须在无默认值参数之后。但路径参数本身就是必填的,可以用Path(...)解决:

# ❌ 错误:Python 语法不允许非默认参数在默认参数之后asyncdefread_item(q:str,# 无默认值item_id:int=Path(gt=0),# 有默认值(Path())):...# ✅ 方式1:都给默认值asyncdefread_item(q:str=Query(default=...),item_id:int=Path(gt=0),):...# ✅ 方式2:路径参数放前面asyncdefread_item(item_id:int=Path(gt=0),q:str=Query(default=...),):...# ✅ 方式3:FastAPI 不关心声明顺序,按参数名匹配# FastAPI 通过参数名与 Path/Query/Body 匹配,不依赖声明顺序asyncdefread_item(item_id:int=Path(gt=0),# 名为 item_id → 路径参数q:Optional[str]=None,# 名为 q → 查询参数):...

9. 包含路径的路径参数

当路径参数本身包含/时,使用 Starlette 的 path 类型:

# 普通路径参数不能包含 /@app.get("/files/{file_path}")# /files/some/file.txt → 404,因为 / 被解析为路径分隔符# 使用 :path 类型允许包含 /@app.get("/files/{file_path:path}")asyncdefread_file(file_path:str):return{"file_path":file_path}
curlhttp://localhost:8000/files/some/dir/file.txt# {"file_path": "some/dir/file.txt"}

10. OpenAPI 文档中的路径参数

路径参数自动出现在文档的Parameters区域:

@app.get("/items/{item_id}",summary="获取项目详情",# 简短描述description="根据 ID 获取项目的详细信息",# 详细描述response_model=ItemResponse,)asyncdefread_item(item_id:int=Path(...,description="项目的唯一标识符",# 参数描述),):...

/docs页面中,item_id会显示为 required path parameter,带有描述和约束信息。


速查表

用法示例说明
基础item_id: int自动类型转换和验证
验证Path(gt=0, le=100)数值范围约束
字符串验证Path(min_length=3, pattern="...")长度和正则约束
枚举限制ModelName(str, Enum)限定可选值
路径包含/{file_path:path}允许参数值含/
多路径参数/users/{uid}/items/{iid}按名称匹配
固定路径优先/users/me/users/{id}避免被参数捕获

总结:路径参数的核心是URL 中的变量 + Python 类型注解自动验证Path()提供数值/字符串约束和文档元数据,枚举类型限定可选值,:path处理含斜杠的路径值。记住固定路径声明在前、参数声明顺序不影响 FastAPI 匹配即可。

http://www.jsqmd.com/news/761414/

相关文章:

  • 为什么BBC、Guardian等顶级媒体都在使用sass-mq:企业级响应式设计实战
  • 双曲空间视觉语言模型中的不确定性对齐技术
  • 5分钟掌握YimMenu:GTA5终极开源防护菜单深度解析
  • 统信UOS蓝牙开关失灵?别慌,用systemctl和rfkill这两条命令轻松搞定
  • ai辅助开发:用快马平台智能解析与优化github镜像项目代码
  • LLM代理安全验证:从形式化证明到动态代码生成
  • 别再乱塞配方了!饥荒联机版Mod开发:用AddRecipe2和自定义过滤器,让你的制作栏井井有条
  • Tri-Prompting视频生成技术解析与应用实践
  • 解锁StreamFX的终极潜力:3步打造专业级OBS视频特效
  • PyTorch GPU环境配置避坑实录:从conda卡死到pip救场,我的Anaconda环境搭建踩坑总结
  • OpenClaw技能库:一站式AI智能体技能管理与自动化实战指南
  • Ecognition10.3安装教程————链接已更新
  • 告别霍尔传感器:用STM32F4驱动BLDC无刷电机的无感控制保姆级教程
  • Museeks疑难解答:常见问题解决方案和故障排除
  • 从R 4.4升级R 4.5后回测结果突变?——深度解析base::sort()行为变更、data.table v1.14.9内存对齐机制及策略失效根因
  • 73.YOLOv8数据集配置(COCO格式),Anchor-Free训练不报错
  • AI结对编程:让快马AI帮你优化串口调试助手代码与解析复杂通信协议
  • Realtek RTL8821CE无线网卡驱动:Linux系统3种快速配置方法终极指南
  • 3步永久保存微信聊天记录:开源工具WeChatMsg的完整实战指南
  • 基于PLC的防冻液精准喷洒控制模糊PID【附代码】
  • 从‘信息损失’到‘分布对齐’:KL散度在推荐系统与A/B测试中的另类用法详解
  • 智能语音助手多模态理解能力评估与优化实践
  • sad与其他工具对比:为什么选择sad而非sed、sd或ripgrep
  • ARM AXI总线系统设计与硬件实现详解
  • 四层测试用例生成与TAROT数据集在AI编程中的应用
  • 2026Q2工程塑料模板厂家名录:塑料模板厂家、塑料模板生产厂家、塑钢模板、墩柱钢模板、定型钢模板、工程塑料模板选择指南 - 优质品牌商家
  • Open UI5 源代码解析之1303:PreventKeyboardScrolling.js
  • 线性代数避坑指南:那些课本没讲清的‘秩’、‘相关性’与‘解的结构’
  • Python配置管理利器:configurations库实现多环境配置自动化
  • 【CNV分析黄金标准失效警告】:R 4.5中DNAcopy默认平滑算法变更导致假阳性激增?我们用1,284个GIAB样本实测验证