持续创作,加速成长!这是我参与「掘金日新计划 · 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
- 1.从
- 只要路径操作函数中的参数的类型是
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参数, 这个我们后面再介绍。