前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >fastapi 请求体 - 多个参数 / 字段Field / 嵌套模型

fastapi 请求体 - 多个参数 / 字段Field / 嵌套模型

作者头像
Michael阿明
发布于 2022-01-07 03:38:15
发布于 2022-01-07 03:38:15
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

learn from https://fastapi.tiangolo.com/zh/tutorial/body-multiple-params/

1. 混合使用 Path、Query 和请求体参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from fastapi import FastAPI, Path
from typing import Optional
from pydantic import BaseModel
app = FastAPI()


class Item1(BaseModel):
    name: str
    price: float
    description: Optional[str] = None
    tax: Optional[float]


@app.put("/items/{item_id}")
async def update_item(
    *,
    item_id: int = Path(..., title="id of item to get", ge=0, le=1000),
    q: Optional[str] = None,
    item: Optional[Item1] = None,
):
    res = {"item_id": item_id}
    if q:
        res.update({"q": q})
    if item:
        res.update({"item": item})
    return res

2. 多个请求体参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    description: Optional[str] = None
    tax: Optional[float]
class User(BaseModel):
    username: str
    full_name: Optional[str] = None

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, user: User):
    res = {"item_id" : item_id, "item" : item, "user": user}
    return res
  • 使用 参数名称 最为 key 的 字典传入

3. 请求体中的单一值

  • 传参时,varname : type = Body(...),如果不这么写,会被作为查询参数 ?varname=xxx
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from fastapi import Body

class Item(BaseModel):
    name: str
    price: float
    description: Optional[str] = None
    tax: Optional[float]
class User(BaseModel):
    username: str
    full_name: Optional[str] = None

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

现在可以写在请求体内:

4. 多个请求体参数和查询参数

由于默认情况下单一值被解释为查询参数,因此你不必显式地添加 Query,你可以仅执行操作:q: str = None

5. 嵌入单个请求体参数

如果你只有一个请求体参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    res = {"item_id" : item_id, "item" : item}
    return res

你的请求体需要写成如下形式:

如果你想写成 带 key 的 json 形式,添加一个传入参数 embed,item: Item = Body(..., embed=True)

6. 字段

可以使用 PydanticFieldPydantic 模型内部声明校验和元数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from fastapi import FastAPI, Path, Body
from typing import Optional
from pydantic import BaseModel, Field
app = FastAPI()


class Item(BaseModel):
    name: str
    price: float = Field(..., gt=0, description="price must be greater than 0")
    description: Optional[str] = Field(None, title="description of item", max_length=30)
    tax: Optional[float] = None

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(..., embed=True)):
    res = {"item_id" : item_id, "item" : item}
    return res

Field 的工作方式和 Query、Path 和 Body 相同,包括它们的参数等等也完全相同

  • 注意,from pydantic import Field

7. 嵌套模型

7.1 List 字段

将一个属性定义为拥有子元素的类型,如 list

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Item(BaseModel):
    name: str
    price: float = Field(..., gt=0, description="price must be greater than 0")
    description: Optional[str] = Field(None, title="description of item", max_length=30)
    tax: Optional[float] = None
    tags: list = [] # 没有声明元素类型
  • 具有子类型的 List,from typing import List
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tags: List[str] = []

7.2 子模型作为类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from fastapi import FastAPI, Path, Body
from typing import Optional, List, Set
from pydantic import BaseModel, Field
app = FastAPI()

class Image(BaseModel):
    url:str
    name: str

class Item(BaseModel):
    name: str
    price: float = Field(..., gt=0, description="price must be greater than 0")
    description: Optional[str] = Field(None, title="description of item", max_length=30)
    tax: Optional[float] = None
    tags: Set[str] = []
    image: Optional[Image] = None
    

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item = Body(..., embed=True)):
    res = {"item_id" : item_id, "item" : item}
    return res

8. 特殊类型校验

  • HttpUrl,检查是不是有效的 URL
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pydantic import BaseModel, Field, HttpUrl
app = FastAPI()

class Image(BaseModel):
    url: HttpUrl
    name: str

则上面的输入应改的地方 "url":"http://www.michael.com",否则不是有效的 URL

9. 带有一组子模型的属性

  • 更改为 image: Optional[List[Image]] = None 输入需要改为
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.post("/images/multiple/")
async def create_multiple_images(images: List[Image]):
    return images

10. 任意 dict 构成的请求体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from typing import Optional, List, Set, Dict
@app.post("/index-weights/")
async def create_index_weights(weights: Dict[int, float]): 
								# key 为 int, value 为浮点
    return weights

请记住 JSON 仅支持将 str 作为键。 但是 Pydantic 具有自动转换数据的功能。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/10/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FastAPI从入门到实战(6)——请求体与嵌套模型
前面记录的是路径参数和查询参数的内容,那两种形式的数据都不算的发送的数据,都是存在路径中的数据,请求体是客户端发给接口的参数,不存在于路径中,本文就主要记录FastAPI中的请求体应用内容。 一个发送请求体的接口 # 创建一个数据模型 class Animal(BaseModel): name:str category:Optional[str] = None age:int # 模型声明为请求体参数 @app03.post("/stu03/responsebody/")
MinChess
2022/12/27
8100
FastAPI从入门到实战(6)——请求体与嵌套模型
FastAPI(13)- 详解 Fields,针对 Pydantic Model 内部字段添加额外校验和元数据
FastAPI 提供的 Query、Path等其他公共 Param 类和 Body 类,都是 Pydantic 的 FieldInfo 类的子类
小菠萝测试笔记
2021/09/27
3.1K0
fastapi 模式的额外信息,示例 / Cookie参数 / Header参数
learn from https://fastapi.tiangolo.com/zh/tutorial/schema-extra-example/
Michael阿明
2022/01/07
4570
fastapi 模式的额外信息,示例 / Cookie参数 / Header参数
FastAPI学习-9. Swagger文档输出请求示例example
前言 可以在 Swagger文档上看到请求示例example,使用Pydantic schema_extra属性来实现。 schema_extra 使用 Config 和 schema_extra 为Pydantic模型声明一个示例,如Pydantic 文档:定制 Schema 中所述: from typing import Optional from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class
上海-悠悠
2022/03/08
4.4K0
FastAPI官方教程太棒了(上)
在2020年的Python开发者调查结果中,有这样一段话:“FastAPI在此次调查迭代中首次被引为选项,表现为Python第三流行的Web框架。”
dongfanger
2022/06/30
4.2K0
FastAPI官方教程太棒了(上)
FastAPI(10)- 详解 Body
当函数只有一个参数指定了 Pydantic Model 且没有其他 Body 参数时,传参的时候请求体可以不指定参数名
小菠萝测试笔记
2021/09/27
2.7K0
FastAPI 学习之路(八)
那么我们测试下,最后是否实现了这个功能,当我们输入所有的参数的时候。
雷子
2021/08/25
5210
FastAPI学习-6.POST请求 JSON 格式 body
前言 post请求接收json格式请求body 创建数据模型 从 pydantic 中导入 BaseModel, 将你的数据模型声明为继承自 BaseModel 的类。 from typing import Optional from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str description: Optional[str] = None pri
上海-悠悠
2022/03/08
10.8K0
FastAPI 构建 API 高性能的 web 框架(二)
参考:https://fastapi.tiangolo.com/zh/tutorial/body-multiple-params/
悟乙己
2023/08/10
4940
FastAPI官方教程太棒了(下)
status_code也可以是IntEnum,比如Python的http.HTTPStatus。
dongfanger
2022/11/21
2.7K0
FastAPI官方教程太棒了(下)
FastAPI(9)- 多个 Request Body
除了路径参数 item_id 是必传的,查询参数 name 和请求体 item 都是可选非必传
小菠萝测试笔记
2021/09/27
9370
fastapi PUT更新数据 / PATCH部分更新
learn from https://fastapi.tiangolo.com/zh/tutorial/body-updates/
Michael阿明
2022/01/07
1.4K0
fastapi PUT更新数据 / PATCH部分更新
FastAPI学习-8.POST请求body中添加Field
前言 与使用 Query、Path 和 Body 在路径操作函数中声明额外的校验和元数据的方式相同,你可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。 Field 字段参数说明 关于 Field 字段参数说明 Field(None) 是可选字段,不传的时候值默认为None Field(…) 是设置必填项字段 title 自定义标题,如果没有默认就是字段属性的值 description 定义字段描述内容 from pydantic import BaseModel,
上海-悠悠
2022/03/08
1K0
FastAPI 学习之路(二十一)请求体 - 更新数据
我们都知道,去创建请求体,更新数据我们用PUT请求,我们去试着更新下数据。
雷子
2021/08/25
9130
FastAPI(19)- Response Model 响应模型
Optional[Union[SetIntStr, DictIntStrAny]]
小菠萝测试笔记
2021/09/27
1.3K0
【FastAPI】请求体
在 FastAPI 中,请求体(Request Body)是通过请求发送的数据,通常用于传递客户端提交的信息。FastAPI 使得处理请求体变得非常容易。
云帆沧海
2024/01/17
1780
【FastAPI】请求体
FastAPI(14)- 路径操作函数参数的类型是一个嵌套 Pydantic Model 的使用场景
tags 虽然声明为 Set(),但在接口层面并没有集合这个概念,所以还是传数组 [ ] 格式哦,并不是传 { } 哦
小菠萝测试笔记
2021/09/27
7500
FastAPI 学习之路(十)
还是之前的例子,我们现在书有这样的一个属性,在哪里出售。我们需要增加这样的一个字段,而且书的可以销售的地方是多个的,那么我们应该如何实现呢。
雷子
2021/08/25
5020
FastAPI后台开发基础(6):Body 参数的几种用法
bowenerchen
2024/10/12
2232
FastAPI后台开发基础(6):Body 参数的几种用法
FastAPI学习-7.POST请求body-多个参数
前言 既然我们已经知道了如何使用 Path 和 Query,下面让我们来了解一下请求体声明的更高级用法。 混合使用 Path、Query 和请求体参数 你可以随意地混合使用 Path、Query 和请求体参数声明,FastAPI 会知道该如何处理。 还可以通过将默认值设置为 None 来将请求体参数声明为可选参数: from typing import Optional from fastapi import FastAPI, Path from pydantic import BaseModel ap
上海-悠悠
2022/03/08
2.2K0
推荐阅读
相关推荐
FastAPI从入门到实战(6)——请求体与嵌套模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文