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

FastAPI入门:查询参数模型、多个请求体参数

查询参数模型

如果你有一组具有相关性的查询参数,你可以创建一个 Pydantic 模型来声明它们。

这将允许你在多个地方去复用模型,并且一次性为所有参数声明验证和元数据

pydantic声明参数

在一个 Pydantic 模型中声明你需要的查询参数,然后将参数声明为 Query

Literal 用于创建一个类型,该类型只能是指定的确切值。相当于枚举类型?

Field是 Pydantic 中用于为模型字段添加验证规则、默认值和元数据的函数。和Path和Query的区别是它只能用于pydantic模型字段

from fastapi import FastAPI, Query , Path# 导入Path和Query类
from typing import Annotated, Literal
from pydantic import BaseModel, Fieldclass FilterParams(BaseModel):limit: int = Field(100, gt=0, le=100)offset: int = Field(0, ge=0)order_by: Literal["created_at", "updated_at"] = "created_at"tags: list[str] = []app = FastAPI()@app.get("/items/")
# 将 Query 用作查询参数的默认值,并将它的 max_length 参数设置为 50
async def read_items(filter_query: Annotated[FilterParams, Query()]):return filter_query

FastAPI 将会从请求的查询参数中提取出每个字段的数据,并将其提供给你定义的 Pydantic 模型。

禁止额外的查询参数

在一些特殊的使用场景中(可能不是很常见),你可能希望限制你要接收的查询参数。

你可以使用 Pydantic 的模型配置来禁止任何额外的字段

class FilterParams(BaseModel):model_config = {"extra": "forbid"}

此时如果添加其他参数,会报错
在这里插入图片描述

多个请求体参数

声明多个pydantic类型作为不同请求体的数据模型

class Item(BaseModel):name: strdescription: str | None = Noneprice: floattax: float | None = Noneclass User(BaseModel):username: strfull_name: str | None = None

接受多个请求体

app = FastAPI()@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, user: User):result = {"item_id": item_id,"item": item,"user": user}return result

此时将会接受形如下面JSON的请求体

{"item": {"name": "string","description": "string","price": 0,"tax": 0},"user": {"username": "string","full_name": "string"}
}

请求体中的单一值

类似于Path和Query,可以使用Body声明请求体

async def update_item(item_id: int, item: Item, user: User, importance: Annotated[int, Body()]):result = {"item_id": item_id,"item": item,"user": user,"importance": importance}return result

此时代码期待如下格式的请求体:

{"item": {"name": "string","description": "string","price": 0,"tax": 0},"user": {"username": "string","full_name": "string"},"importance": 0
}

嵌入单个请求体参数

你希望它期望一个拥有 item 键并在值中包含模型内容的 JSON,就像在声明额外的请求体参数时所做的那样,则可以使用一个特殊的 Body 参数 embed

async def update_item(item_id: int, item: Annotated[Item, Body(embed=True)]):result = {"item_id": item_id,"item": item}return result

在这种情况下,FastAPI 将期望像这样的请求体:

{"item": {"name": "Foo","description": "The pretender","price": 42.0,"tax": 3.2}
}

而不是

{"name": "Foo","description": "The pretender","price": 42.0,"tax": 3.2
}
http://www.dtcms.com/a/300885.html

相关文章:

  • (LeetCode 面试经典 150 题)71. 简化路径 (字符串)
  • 小白投资理财 - 从换手率和成交量分析股票趋势
  • Vue vuex模块化编码
  • 网络资源模板--基于Android Studio 实现的新闻App
  • 自由学习记录(74)
  • 基于混沌系统的图像加密学习日志——论文学习3
  • unity3dTextMeshPro 设置中文字体,解决中文显示为框或中文字后面带背景颜色的问题
  • Unity SMAA
  • 三、搭建springCloudAlibaba2021.1版本分布式微服务-springcloud loadbalancer负载均衡
  • 习题综合练习
  • 自然语言处理NLP (1)
  • 【笔记】系统
  • 上位机知识篇---AJAX
  • MongoDB分片集群横向扩展
  • 2.qt调试日志输出
  • 区块链共识机制与联邦学习
  • 【C++】数字cmath库常用函数
  • 基于深度学习的图像分类:使用ShuffleNet实现高效分类
  • LeetCode 1577.数的平方等于两数乘积的方法数
  • day061-全网监控
  • 【科研绘图系列】R语言绘制边际云雨图散点图
  • 【unitrix】 6.17 基本非负整数( BaseUnsigned )特质(base_unsigned.rs)
  • 【笔记】拉乌尔定律推导
  • 获取电脑主板的 通用唯一标识符(UUID)
  • C++学习(线程相关)
  • Git+宝塔面板部署Hugo博客
  • 【橘子分布式】gRPC(番外篇-客户端重试机制)
  • 五自由度磁悬浮轴承转子不平衡振动破壁战:全息前馈控制实战密码
  • 【DataWhale】快乐学习大模型 | 202507,Task08笔记
  • STM32移植LVGL9.2.1教程