请求体是客户端发送给API的数据,fastApi使用 Pydantic 模型来声明请求体
不能使用 GET操作(HTTP 方法)发送请求体。
要发送数据,必须使用下列方法之一:POST
(较常见)、PUT
、DELETE
或 PATCH
创建数据类型
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
和查询参数一样,当一个模型属性具有默认值时,它不是必须的,否则它是一个必须属性,如果默认值为None,那么它是可选属性
声明为参数
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
使用与声明路径和查询参数的相同方式声明请求体,即可将其添加到「路径操作」中,同时将它的类型声明为创建的Item模型
由于description和tax是可选参数,这两种请求入参都是可行的。
{
"name": "Foo",
"description": "An optional description",
"price": 45.2,
"tax": 3.5
}
{
"name": "Foo",
"price": 45.2
}
使用模型
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
item_dict = item.dict()
if item.tax:
price_with_tax = item.price + item.tax
item_dict.update({"price_with_tax": price_with_tax})
return item_dict
在函数内部,可以直接访问模型对象的所有属性
请求体+路径参数+查询参数
函数参数将依次按如下规则进行识别:
- 如果在路径中也声明了该参数,它将被用作路径参数。
- 如果参数属于单一类型(比如
int
、float
、str
、bool
等)它将被解释为查询参数。 - 如果参数的类型被声明为一个 Pydantic 模型,它将被解释为请求体。
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
app = FastAPI()
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item, q: str | None = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result