RequestBody参数会有很多情况,最简单的是只有一个数据模型,只需要声明一个BaseModel即可;如果有多个数据模型,或者除了数据模型外还有单个值。
如下,RequestBody会有两个数据模型:Item和User
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
class User(BaseModel):
username: str
full_name: str = None
@app.put("/items/{item_id}")
async def update_item(*, item_id: int, item: Item, user: User):
results = {"item_id": item_id, "item": item, "user": user}
return results
相应的数据体会被解析为键值对的值,键名为参数名,同时数据体内的变量也会被进行数据校验,如上会被解析为
{
“item”: {
“name”: “Foo”,
“description”: “The pretender”,
“price”: 42.0,
“tax”: 3.2
},
“user”: {
“username”: “dave”,
“full_name”: “Dave Grohl”
}
}
如下,RequestBody会有多个数据模型User、Item和单个参数importance
from fastapi import Body, FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
class User(BaseModel):
username: str
full_name: str = None
@app.put("/items/{item_id}")
async def update_item(
*, item_id: int, item: Item, user: User, importance: int = Body(...)
):
results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
return results
如上会被解析为
{
“item”: {
“name”: “Foo”,
“description”: “The pretender”,
“price”: 42.0,
“tax”: 3.2
},
“user”: {
“username”: “dave”,
“full_name”: “Dave Grohl”
},
“importance”: 5
}
单个数据模型直接放进参数,默认只会将其数据模型内容传入,如果被作为JSON传入,则可以使用item: Item = Body(…, embed=True)
from fastapi import Body, FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.put("/items/{item_id}")
async def update_item(*, item_id: int, item: Item = Body(..., embed=True)):
results = {"item_id": item_id, "item": item}
return results
如上,可被解释为{
“item”: {
“name”: “Foo”,
“description”: “The pretender”,
“price”: 42.0,
“tax”: 3.2
}
}