引入请求体的几种方式
在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}
Dict方式
要使用此种方式引用数据体参数,需要首先从typing包中引入Dict类型。
# 演示dict方式引用请求体参数
from typing import Dict
@app.patch("/items")
# 在路径操作函数中将形参类型设定为Dict类型,表示接收任何符合此类型的键值对作为数据体参数
async def update_part_item(item:Dict[str,str]):
return item
限制请求体的几种方式
在请求体参数中,我们也可以做一些限制要求。使得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函数形参说明
请求体嵌套使用问题
请求体嵌套就是一个请求体中嵌套着另一个请求体。
如何嵌套使用请求体
# 演示嵌套请求体
# 定义一个基础请求体模型
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方式进行方便快捷的字段限制 |