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

FastAPI 查询参数

FastAPI 查询参数(Query Parameters)

1. 基础用法

查询参数是 URL 中?之后的部分,FastAPI 根据函数参数自动识别:

fromfastapiimportFastAPIfromtypingimportOptional app=FastAPI()@app.get("/items")asyncdefread_items(skip:int=0,limit:int=10):return{"skip":skip,"limit":limit}
curl"http://localhost:8000/items?skip=5&limit=20"# {"skip": 5, "limit": 20}curl"http://localhost:8000/items"# {"skip": 0, "limit": 10} ← 使用默认值

参数分类规则

FastAPI 根据以下规则自动判断参数类型:

参数特征识别为示例
与路径{param}同名路径参数item_idin/items/{item_id}
Pydantic 模型类型请求体item: ItemCreate
其他(单值类型)查询参数skip: int = 0
# 三种参数共存@app.get("/items/{item_id}")asyncdefread_item(item_id:int,# 路径参数(与路径变量同名)q:Optional[str]=None,# 查询参数short:bool=False,# 查询参数):return{"item_id":item_id,"q":q,"short":short}

2. 必填 vs 可选 vs 默认值

fromfastapiimportQueryfromtypingimportOptional@app.get("/items")asyncdefread_items(# 必填查询参数(无默认值)keyword:str,# 等价写法keyword:str=Query(...),# 可选查询参数(None 默认值)category:Optional[str]=None,# 等价写法category:Optional[str]=Query(default=None),# 带默认值skip:int=0,limit:int=10,):return{"keyword":keyword,"category":category,"skip":skip,"limit":limit}
# keyword 必填,缺失则 422curl"http://localhost:8000/items"# {"detail":[{"loc":["query","keyword"],"msg":"field required","type":"value_error.missing"}]}curl"http://localhost:8000/items?keyword=phone"# {"keyword":"phone","category":null,"skip":0,"limit":10}curl"http://localhost:8000/items?keyword=phone&category=electronics&skip=5"# {"keyword":"phone","category":"electronics","skip":5,"limit":10}

3. Query() 验证

字符串约束

@app.get("/search")asyncdefsearch(q:str=Query(...,min_length=1,# 最少 1 个字符max_length=50,# 最多 50 个字符pattern="^[a-zA-Z0-9 ]+$",# 正则匹配title="搜索关键词",description="输入要搜索的关键词",),):return{"q":q}
约束含义
min_length最小长度
max_length最大长度
pattern正则表达式

数值约束

@app.get("/items")asyncdeflist_items(skip:int=Query(default=0,ge=0),# 大于等于 0limit:int=Query(default=20,ge=1,le=100),# 1~100price_min:Optional[float]=Query(default=None,gt=0),price_max:Optional[float]=Query(default=None,gt=0),):return{"skip":skip,"limit":limit}
约束含义适用类型
gt大于int,float
ge大于等于int,float
lt小于int,float
le小于等于int,float
multiple_of必须是某数的倍数int,float

布尔类型自动转换

@app.get("/items")asyncdeflist_items(short:bool=False):return{"short":short}
# 以下都等价于 short=Truecurl"http://localhost:8000/items?short=true"curl"http://localhost:8000/items?short=True"curl"http://localhost:8000/items?short=1"curl"http://localhost:8000/items?short=yes"curl"http://localhost:8000/items?short=on"# 以下都等价于 short=Falsecurl"http://localhost:8000/items?short=false"curl"http://localhost:8000/items?short=0"curl"http://localhost:8000/items?short=no"

4. 多值查询参数

fromtypingimportList,Optional@app.get("/items")asyncdeflist_items(tags:List[str]=Query(default=[]),):return{"tags":tags}
curl"http://localhost:8000/items?tags=python&tags=fastapi&tags=web"# {"tags": ["python", "fastapi", "web"]}# 也可以用逗号分隔(需要声明)# tags: str = Query(default="") → 手动 split(",")

多值 + 验证

@app.get("/items")asyncdeflist_items(tags:List[str]=Query(default=[],min_length=1,# 每个值至少 1 个字符max_length=20,# 每个值最多 20 个字符),):return{"tags":tags}

5. 别名(alias)

当查询参数名不是合法的 Python 标识符时,使用别名:

@app.get("/items")asyncdeflist_items(item_type:Optional[str]=Query(default=None,alias="type",# URL 中用 type,代码中用 item_type),):return{"type":item_type}
# URL 中使用别名curl"http://localhost:8000/items?type=electronics"# {"type": "electronics"}

6. 废弃参数(deprecated)

标记参数为废弃,文档中会显示删除线,但仍可使用:

@app.get("/items")asyncdeflist_items(q:Optional[str]=Query(default=None,deprecated=True),search:Optional[str]=Query(default=None),):return{"search":search}

7. 参数排除(exclude)

从 OpenAPI 文档和验证中隐藏参数:

@app.get("/items")asyncdeflist_items(q:Optional[str]=Query(default=None,include_in_schema=False),):return{"q":q}

8. 查询参数模型

当查询参数过多时,用 Pydantic 模型组织:

frompydanticimportBaseModel,FieldfromtypingimportOptionalclassItemFilter(BaseModel):keyword:Optional[str]=Field(default=None,min_length=1,max_length=50)category:Optional[str]=Nonemin_price:Optional[float]=Field(default=None,gt=0)max_price:Optional[float]=Field(default=None,gt=0)skip:int=Field(default=0,ge=0)limit:int=Field(default=20,ge=1,le=100)@app.get("/items")asyncdeflist_items(filter:ItemFilter=Query()):# filter 是查询参数模型,不是请求体returnfilter.model_dump()
curl"http://localhost:8000/items?keyword=phone&min_price=100&max_price=500&skip=0&limit=10"# {"keyword":"phone","category":null,"min_price":100.0,"max_price":500.0,"skip":0,"limit":10}

关键filter: ItemFilter = Query()告诉 FastAPI 这是查询参数模型,不是请求体。如果写成filter: ItemFilter则会被识别为请求体。


9. 查询参数的必填/可选总结

fromfastapiimportQueryfromtypingimportOptional@app.get("/demo")asyncdefdemo(# ── 必填 ──a:str,# 无默认值b:str=Query(...),# 显式必填# ── 可选(None) ──c:Optional[str]=None,# 简写d:str|None=None,# Python 3.10+e:Optional[str]=Query(default=None),# 显式# ── 带默认值 ──f:int=0,# 简写g:int=Query(default=10),# 显式):return{"a":a,"b":b,"c":c,"d":d,"e":e,"f":f,"g":g}

10. 实际示例:分页 + 筛选 + 排序

fromfastapiimportFastAPI,QueryfromtypingimportOptionalfromenumimportEnum app=FastAPI()classSortOrder(str,Enum):asc="asc"desc="desc"@app.get("/products")asyncdeflist_products(# 分页page:int=Query(default=1,ge=1,description="页码"),page_size:int=Query(default=20,ge=1,le=100,description="每页数量"),# 筛选keyword:Optional[str]=Query(default=None,min_length=1,max_length=100,description="搜索关键词",),category:Optional[str]=Query(default=None,description="商品分类"),min_price:Optional[float]=Query(default=None,gt=0,description="最低价格"),max_price:Optional[float]=Query(default=None,gt=0,description="最高价格"),in_stock:Optional[bool]=Query(default=None,description="仅显示有货"),# 排序sort_by:Optional[str]=Query(default="created_at",description="排序字段"),sort_order:SortOrder=Query(default=SortOrder.desc,description="排序方向"),# 标签(多值)tags:list[str]=Query(default=[],description="标签筛选"),):offset=(page-1)*page_sizereturn{"pagination":{"page":page,"page_size":page_size,"offset":offset},"filters":{"keyword":keyword,"category":category,"price_range":[min_price,max_price],"in_stock":in_stock,"tags":tags,},"sort":{"by":sort_by,"order":sort_order},}
curl"http://localhost:8000/products?page=2&page_size=10&keyword=phone&min_price=100&max_price=999&tags=5g&tags=flagship&sort_by=price&sort_order=asc"

速查表

用法语法说明
必填q: strQuery(...)缺失返回 422
可选Optional[str] = None值可为 None
默认值skip: int = 0未传时使用默认值
字符串验证Query(min_length=, max_length=, pattern=)长度和正则
数值验证Query(ge=, le=, gt=, lt=)范围约束
多值List[str] = Query(default=[])?tags=a&tags=b
别名Query(alias="type")URL 名与变量名不同
废弃Query(deprecated=True)文档标记删除线
隐藏Query(include_in_schema=False)不出现在文档
参数模型filter: Model = Query()用 Pydantic 模型组织

总结:查询参数的核心是URL?key=value+ 函数默认值/类型注解自动识别Query()提供验证约束和文档元数据,Optional或默认值控制必填/可选,List处理多值,alias解决命名冲突,Pydantic 模型组织复杂参数。FastAPI 的自动识别规则让简单场景零配置,复杂场景有Query()兜底。

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

相关文章:

  • 除了中科大和阿里云,Kali换源还有哪些冷门但好用的选择?实测对比
  • 手把手教你用MSP430单片机驱动DS18B20:从Proteus仿真到LCD1602显示的保姆级教程
  • 别光会跑压测!JMeter线程组参数(线程数、Ramp-Up)到底怎么设才合理?
  • RISC-V向量扩展V1.0 Spec精读:vtype、vlenb这些CSR寄存器到底怎么用?
  • Vivado里找不到ISE的IP怎么办?用源码重建AXI Slave Burst等老IP的实战记录
  • PHP 8.9垃圾回收机制重大升级:3个被官方文档隐藏的refcount优化技巧,99%开发者尚未启用
  • CVAT团队标注实战:如何用Task和Jobs功能搞定多人协同与质量管理
  • 手把手教你用FPGA驱动SHT30/SHT35温湿度传感器(附Verilog代码)
  • GD32外部中断EXTI保姆级教程:从GPIO映射到中断服务函数,手把手搞定按键计数
  • ROS2 Humble开发避坑:从Node到Component的迁移指南(含跨平台编译visibility_control.h详解)
  • 从ARM转战RISC-V踩坑记:CH32V307中断只进一次?一个关键字搞定
  • 别再死记硬背了!用Python代码实现NFA转DFA,理解编译原理核心算法
  • Claude Code 如何通过 Taotoken 配置 API 密钥与聚合端点实现快速接入
  • 多模态视频超分辨率技术:原理、应用与优化
  • MoeCTF 2025 Writeup
  • 别再手动改yaml了!Dify 2026审计配置自动化脚本开源实测:3分钟生成符合等保三级要求的全链路配置包
  • 2026海水淡化不锈钢厂家地址:S31254材质保真、S31254焊管、S31254现货供应、S31254管材选择指南 - 优质品牌商家
  • 告别毕业论文焦虑:用百考通AI一站式搞定本科论文终稿
  • VLA-4D框架:让机器人理解复杂指令的4D视觉语言动作模型
  • Docker Compose 与 Kubernetes 在小型项目部署中的选型对比
  • 告别重复劳动:用快马AI自动生成Matlab风格的数据分析与可视化模板
  • GEC6818开发板玩出新花样:用C语言+LVGL实现智能贩卖机,并接入虚拟机服务器做数据管理
  • 自适应预测分布收敛性研究及其应用
  • 智能体应用生态测绘:从Agent Usage Atlas看技术选型与架构设计
  • 72.YOLOv8实战教程,CUDA118加速,mAP50破0.92,代码亲测可用
  • 毕业季论文自救指南:用“百考通AI”高效搞定本科毕业论文终稿
  • 2026选优质东方高端珠宝,这些要点要知道,高端珠宝/东方秩序/东方美学珠宝/东方高端珠宝,东方高端珠宝设计有哪些 - 品牌推荐师
  • GTNH汉化完整指南:3步实现GregTech整合包中文界面
  • 室内灯光也能用!手把手教你为低功耗传感器DIY太阳能充电模块(附完整电路图)
  • 2026储能包塑金属软管技术解析:消防塑料波纹管、消防用包塑金属软管、穿线波纹管、船舶包塑金属软管、设备线束塑料波纹管选择指南 - 优质品牌商家