夸智网
扫描关注夸智网

手机扫描二维码

FastAPI-9-多个请求体参数

夸智网2023-09-19博客 4 0A+A-

可以声明多个请求体参数,例如 item 和 user:

 

from typing import Optional

from fastapi import FastAPI

from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):

name: str

description: Optional[str] = None

price: float

tax: Optional[float] = None

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):

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"

}

}请注意,即使 item 的声明方式与之前相同,但现在它被期望通过 item 键内嵌在请求体中。

请求体中的单一值¶

与使用 Query 和 Path 为查询参数和路径参数定义额外数据的方式相同,FastAPI 提供了一个同等的 Body。

例如,为了扩展先前的模型,你可能决定除了 item 和 user 之外,还想在同一请求体中具有另一个键 importance。

如果你就按原样声明它,因为它是一个单一值,FastAPI 将假定它是一个查询参数。

但是你可以使用 Body 指示 FastAPI 将其作为请求体的另一个键进行处理。

from typing import Optional

from fastapi import Body, FastAPI

from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):

name: str

description: Optional[str] = None

price: float

tax: Optional[float] = None

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(...)

):

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

}

 

查看原文

发表评论