FastAPI(8)- 请求体 Request Body

时间:2021-09-23 13:29:27   收藏:0   阅读:38

前言

 

注意

 

不使用 Pydantic的栗子

from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.post("/items")
async def read_item(item: dict):
    return {"item": item}


if __name__ == "__main__":
    uvicorn.run(app="6_request:app", host="127.0.0.1", port=8080, reload=True, debug=True)

指定查询参数的类型为 dict

 

正确传参的请求结果

技术分享图片

技术分享图片

 

查看请求头

技术分享图片

是 json 格式,符合预期 

 

重点

 

错误传参的请求结果

技术分享图片

 

选了 text 之后,因为不是 JSON 字符串,FastAPI 无法正确解析请求体为 dict,所以会报类型错误的提示

 

查看请求头

技术分享图片

 

类型是 text

 

使用 Pydantic 模型(建议使用)

优势

 

实际栗子

from fastapi import FastAPI
from typing import Optional
from pydantic import BaseModel

app = FastAPI()


# 自定义一个 Pydantic 模型
class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None


@app.post("/items/")
# item 参数的类型指定为 Item 模型
async def create_item(item: Item): 
    return item

 

参数指定为 Pydantic 模型后,FastAPI 做了这几件事

  1. 将请求体识别为 JSON 字符串
  2. 将属性值转换相应的类型(若有需要)
  3. 验证数据,如果验证失败,会返回一个清晰的错误,准确指出错误数据的位置和信息
  4. item 会接收到完整的请求体数据,拥有所有属性及其类型,IDE 也会给予对应的智能提示
  5. 给 Pydantic 模型自动的生成 JSON Schema,这些 Schema 会成为生成 OpenAPI Schema 的一部分,并显示在接口文档上

 

正确传参的请求结果

技术分享图片

正常传参,所有属性按指定的类型进行传数据

 

属性类型自动转换的请求结果

技术分享图片

FastAPi 会自动将传进来的值转换为指定类型的值

如果转换失败,则会报 type_error 错误(如下图)

 

验证数据失败的请求结果

技术分享图片

 

查看 Swagger API 文档

Schema 部分

技术分享图片

model 的 JSON Schema 会成为 Swagger APi 文档的一部分

 

示例值部分

技术分享图片

 

IDE 智能提示

因为知道 name 属性的类型是 str,所以 IDE 会智能提示 str 内置的方法

技术分享图片

 

Request body + path + query parameters 综合栗子

 

实际代码

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,
        # 查询参数
        name: Optional[str] = None):
    result = {"item_id": item_id, **item.dict()}
    print(result)
    if name:
        # 如果查询参数 name 不为空,则替换掉 item 参数里面的 name 属性值
        result.update({"name": name})
    return result

 

FastAPI 识别参数的逻辑

 

正确传参的请求结果

技术分享图片

 

Pycharm Console 输出结果

打印 result 的值

{item_id: 1234, name: 小菠萝, description: 描述,非必填, price: 12.22, tax: 0.0}

 

查看 Swagger API 文档

技术分享图片

 

原文:https://www.cnblogs.com/poloyy/p/15309691.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!