FastAPI-10:详解Body


FastAPI-10:详解Body

前言

  • 上一篇有讲到将参数类型指定为Pydantic Model,这样FastAPI会解析它为一个Request Body;
  • 那单类型(int、float、str、bool…)参数可以成为Request Body的一部分吗?答案显然是肯定的;
  • 通过Body函数即可完成,和Path、Query有异曲同工之妙。

Body

  • 主要作用:可以将但类型的参数成为Request Body的一部分,即从查询参数变成请求体参数;
  • 和Query、Path提供的额外校验、元数据是基本一致的(多了个embed参数,最后详解)。

Body的简单栗子

from typing import Optional
import uvicorn
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
if __name__ == '__main__':
    uvicorn.run(app='eighth-8:app', host='0.0.0.0', port=8080, debug=True)

正确传参的请求结果:

传递的参数中多了importance参数

查看Swagger API 文档:

Query、Path、Body终极混用

from fastapi import Path, Query
@app.put("/item_all/{item_id}")
async def update_item(
        *,
        item_id: int = Path(default=..., description="路径参数", gt=0, lt=10),
        address: str = Query(default=None, description="查询参数", max_length=10),
        item: Item,
        user: User,
        importance: int = Body(default=..., description="请求体", ge=1, le=5)
):
    results = {
        "item_id": item_id,
        "address": address,
        "item": item,
        "user": user,
        "importance": importance
    }
    return results

正确传参的结果:

查看Swagger API文档:

Body设置的元数据会在JSON Schema中体现

Body()中的embed参数

为什么要讲这个embed参数

当函数只有一个参数指定了Pydantic Model且没有其他Body传参时,传参的时候请求体可以不指定参数名

@app.put('/item/{item_id}')
async def update_item(
    item_id: int,
    item: Item,
):
    return {'item_id': item_id, 'item': Item}
# 默认并不需要指定item为字段名
# 如果想要指定item为请求体的字段名,就是通过embed参数达到目的了
@app.put("/items/{item_id}")
async def update_item(
        *,
        item_id: int,
        # 将 embed 设置为 True
        item: Item = Body(..., embed=True)
):
    results = {"item_id": item_id, "item": item}
    return results

正确传参的请求结果:

不传item字段的请求结果:

查看 Swagger API 文档:


文章作者: 刘宇亭
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 刘宇亭 !
评论
  目录