fastapi_No.4_请求体参数详述

引入请求体的几种方式

在fastapi中引入请求体参数的方式有三种,分别是通过继承Pydantic中BaseModel类方式,通过fastapi中Body函数方式,还有一种就是通过dict方式。

继承BaseModel方式

这种方法主要的步骤是:1.创建BaseModel的子类,用来表示请求体参数的JSON格式。2.路径操作函数中将形参声明为创建的子类类型。

# 第一步:导入fastapi包
from fastapi import FastAPI
# 导入typing包为了提供类型提示的运行时支持
from typing import Union
# 第二步:创建FastAPI类的实例对象
app = FastAPI()
# 演示通过继承BaseModel类来引用请求体参数
# 第三步:创建继承自BaseModel类的子类,用来表示请求体数据模型
# BaseModel子类声明的是一个JSON类型的请求体格式,请求体将当做JSON读取
from pydantic import BaseModel
class Item(BaseModel):
    name:str
    # description 和 tax都是可选字段
    description:Union[str,None] = None  
    price:float
    tax:Union[float,None] = None
# 第四步:创建路径装饰器和路径操作函数
@app.post("/items")
# 在路径操作函数中将形参声明为BaseModel子类的类型
async def create_item(item:Item):
    return item
# 第五步:运行服务器
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app=app,host="localhost",port=8080)

如下图由于description和tax字段是可选的,在发送请求时忽略它们,fastapi依旧能够得到正确的回复。
当请求体中没有可选参数时可正常回复
如下图当请求体中包含description和tax字段时,fastapi回复时会携带上相关的信息。
将请求体补全时的状态

Body函数方式

要使用Body函数方式引入请求体参数,需要首先从fastapi中引入Body函数。

Body函数方式只能针对单个字段进行设置,如果有多个字段,需要多次引用Body函数。

# 演示Body函数引用数据体参数
from fastapi import Body
@app.put("/items")
# 在路径操作函数中将形参默认值声明为Body函数,表示该形参是请求体中的某个字段
async def update_item(name:str=Body(),tax:float=Body()):
    return {"name":name,"tax":tax}

Body函数方式声明引用请求体参数

Dict方式

要使用此种方式引用数据体参数,需要首先从typing包中引入Dict类型。

# 演示dict方式引用请求体参数
from typing import Dict
@app.patch("/items")
# 在路径操作函数中将形参类型设定为Dict类型,表示接收任何符合此类型的键值对作为数据体参数
async def update_part_item(item:Dict[str,str]):
    return item

Dict方式引入请求体参数

限制请求体的几种方式

在请求体参数中,我们也可以做一些限制要求。使得FastAPI只针对满足限制条件的请求体数据作出正确的回复。

针对BaseModel方式

在BaseModel子类方式引入请求体参数中,我们通过引入Pydantic中Field函数,对每个请求体字段进行限制。

# 演示对BaseModel方式引入的请求体参数进行限制
# 针对这种类型,首先需要引入Field函数
from pydantic import Field
# 利用Field函数为每个需要做限制的字段设定默认值
class Student(BaseModel):
    name:str = Field(min_length=3)
    age:int = Field(gt=0)
@app.post("/student")
async def create_student(stu:Student):
    return stu

在这个示例中要求学生姓名长度至少3长度,年龄需要大于0。
满足要求的示例:
有效的响应
不满足要求的示例:
无效的响应

针对Body函数方式

针对Body函数方式引用请求体参数时,需要利用Body函数中的形参进行限制。

# 演示对Body方式引入的请求体参数进行限制
@app.put("/student")
# 利用Body函数中的参数对每个请求体字段进行限制
async def update_student(name:str=Body(min_length=3),age:int=Body(gt=0)):
    return {"name":name,"age":age}

满足要求的示例:
有效的结果
不满足要求的示例:
无效的结果

针对Dict方式

针对Dict方式引入的请求体参数,不太方便快捷的做出限制。因为这种方式引入的请求体,事先不知道其请求体可能的字段是哪些。

Field和Body函数形参说明

参见Path函数形参说明部分

请求体嵌套使用问题

请求体嵌套就是一个请求体中嵌套着另一个请求体。

如何嵌套使用请求体

# 演示嵌套请求体
# 定义一个基础请求体模型
class Image(BaseModel):
    url:str
    name:str
# 定义一个使用了基础请求体模型的嵌套模型
class ImageItem(BaseModel):
    name:str
    description:str
    price:float
    tax:Union[float,None] = None
    image:Union[Image,None] = None

@app.post("/imageitem")
async def create_imageitem(imageItem:ImageItem):
    return imageItem

示例结果:
嵌套请求体示例结果

几种请求体引入方式使用场景介绍

引入方式使用场景
BaseModel最常用的引入方式,针对多个字段的请求体较为方便。可以通过Field进行字段限制,可以通过Python的类继承,复用字段。使用前提是已知请求体的字段格式
Body主要是对BaseModel方式的补充,用来对单值请求体的引用。可以通过Body进行字段限制
Dict应用在未知请求体字段格式的情况下,无法像BaseModel和Body方式进行方便快捷的字段限制
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习_程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值