fastapi之请求体参数

440 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

请求体

  • HTTP协议是基于请求-响应的协议,即先有客户端请求,再有服务端响应。
  • 客户端在请求时给服务端发送数据,可以将数据放在请求体中;服务端从请求体拿到数据。
  • 对于常见的前后端分离项目,前后端一般通过JSON格式做数据交互,即前端给后端的请求体数据是JSON格式的,类似的后端给前端的响应数据也是JSON格式的。
  • fastapi提供了一种非常方便的获取前端提交的JSON格式的请求体参数。

创建数据模型

  • 比如,前端给后端发送POST请求的请求,请求体数据格式如下:
 {
     "name": "Foo",
     "description": "An optional description",
     "price": 45.2,
     "tax": 3.5
 }
  • 此时,后端接收该数据的方式如下:

    • 1.从pydantic导入BaseModel
    • 2.创建类Item并继承BaseModel,在类下面定义类属性
    • 3.定义的类属性就是请求体中的json字段
    • 3.在路径操作函数中,定义变量item,并做类型提示为Item
  • 只要路径操作函数中的参数的类型是BaseModel的子类,那fastapi就会识别出来这个参数用来接收请求体数据。
 from fastapi import FastAPI
 from pydantic import BaseModel
 ​
 ​
 class Item(BaseModel):
     name: str
     description: str
     price: float
     tax: float
 ​
 ​
 app = FastAPI()
 ​
 ​
 @app.post("/items/")
 def create_item(item: Item):
     return {"code": 1, "msg": "success"}
  • 如此一来,当fastapi收到客户端的POST请求时,

    • 自动提取请求体中的JSON数据,
    • 在需要时做类型转换,
    • 数据校验,
    • 将接收的数据赋值到参数item中,
    • 提供openapi文档支持等等。

使用模型

  • 通过参数item,可以直接获取请求体中的每个json字符及数据,并且还提供了一些常用工具。
 @app.post("/items/")
 async def create_item(item: Item):
     print(item)
     print(item.name, item.price)
     print(item.dict())
     print(item.json())
     return {"code": 1, "msg": "success"}

请求体参数类型提示

  • 我们还可以在构建数据模型时,对请求体字段类型和值做限制,比如:

    • 设置description有默认值
    • 设置tax是可选参数(默认值设置为None表示可选参数,同路径参数和查询参数)
 from typing import Optional
 ​
 from pydantic import BaseModel
 ​
 class Item(BaseModel):
     name: str
     description: str = "描述"
     price: float
     tax: Optional[float] = None
  • 如此一来,请求体josn数据可以这样:
 {
     "name": "Foo",
     "price": 45.2
 }
  • 如果你不想使用Pydantic模型,你还可以使用Body参数, 这个我们后面再介绍。