FastAPI使用请求体从客户端向API发送数据,请求体是客户端发送给API的数据,响应体是API发送给客户端的数据。API基本上肯定要发送响应体,但是客户端不一定发送请求体。使用pydantic模型声明请求体。

发送数据使用post(最常用)、put、delete、patch等操作。规范中没有定义使用get发送请求体的操作,但是不管怎样,FastAPI也支持这种方式,只不过仅用于非常复杂或极端的用例。

导入Pydantic的baseModel

from pydantic import BaseModel

创建数据模型

把数据模型声明为继承baseModel的类,使用python标准类型声明所有属性:

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

 

声明请求体参数

使用与声明路径和查询参数相同的方式声明请求体,把请求体添加至路径操作。

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None


app = FastAPI()


@app.post("/items/")
async def create_item(item: Item):
    return item

上面代码中请求体参数的类型为Item模型。

与声明查询参数一样,包含默认值的模型属性是可选的,否则就是必选的,默认值为None的模型属性也是可选的。

使用模型

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = 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

在路径操作函数内部直接访问模型对象的属性。

 

请求体+路径参数

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None


app = FastAPI()


@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}

FastAPI支持同时声明路径参数和请求体,能识别与路径参数匹配的函数参数,还能识别从请求体中获取的类型为Pydantic模型的函数参数。

 

请求体+路径参数+查询参数

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None


app = FastAPI()


@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
    result = {"item_id": item_id, **item.dict()}
    if q:
        result.update({"q": q})
    return result

FastAPI支持同时声明的请求体、路径参数和插叙参数,能够正确识别这三种参数,并从正确的位置获取数据。

函数参数按如下规则进行识别:

  • 路径中声明了相同参数的参数,是指路径参数
  • 类型时(int、float、str、bool等)单类型的参数,是查询参数
  • 类型时Pydantic模型的参数,是请求体
posted on 2022-04-28 14:55  司徒轩宇  阅读(114)  评论(0编辑  收藏  举报