FastAPI怎么处理Request Body请求体?

文章导读
Previous Quiz Next 我们现在将使用 Pydantic model 对象作为客户端请求的请求体。如前所述,为此我们需要使用 POST 操作装饰器。
A A

FastAPI - 请求体



Previous
Quiz
Next

我们现在将使用 Pydantic model 对象作为客户端请求的请求体。如前所述,为此我们需要使用 POST 操作装饰器。

main.py

from fastapi import FastAPI
from typing import List
from pydantic import BaseModel, Field

app = FastAPI()

class Student(BaseModel):
   id: int
   name :str = Field(None, title="name of student", max_length=10)
   subjects: List[str] = []

@app.post("/students/")
async def student_data(s1: Student):
   return s1

可以看到,student_data() 函数被 @app.post() 装饰器装饰,URL 端点为 "/students/"。它从客户端请求中接收 Student class 的对象作为 Body 参数。要测试此路由,请启动 Uvicorn server,并在浏览器中访问 http://localhost:8000/docs 打开 Swagger UI 文档。

文档显示 "/students/" 路由与 student_data() 函数关联,使用 POST 方法。在 schemas 部分将列出 Student model。

FastAPI Request Body

展开其前面的节点以显示 model 的结构。

FastAPI Request Body

点击 Try it out 按钮,在请求体中填写测试值。

FastAPI Request Body

点击 Execute 按钮并获取服务器的响应值。

FastAPI Request Body

虽然 Pydantic model 会自动填充请求体,但也可以使用单个值为其添加属性。为此,我们需要将 Body class 对象用作要装饰的操作函数的参数。

首先,需要从 fastapi 导入 Body class。如以下示例所示,在 @app.post() 装饰器下方的 student_data() 函数定义中,将 'name' 和 'marks' 声明为 Body 参数。

main.py

from fastapi import FastAPI, Body
from typing import List
from pydantic import BaseModel, Field

app = FastAPI()

class Student(BaseModel):
   id: int
   name :str = Field(None, title="name of student", max_length=10)
   subjects: List[str] = []

@app.post("/students/")
async def student_data(name:str=Body(...), marks:int=Body(...)):
   return {"name":name,"marks": marks}

如果检查 Swagger UI 文档,我们应该能够找到与 student_data() 函数关联的此 POST 方法,并具有两个参数的请求体。

FastAPI Request Body

也可以声明一个操作函数,同时具有 path 和/或 query 参数以及请求体。让我们修改 student_data() 函数,使其具有 path 参数 'college'、query 参数 'age' 和 Student model 对象作为 body 参数。

main.py

from fastapi import FastAPI, Body
from typing import List
from pydantic import BaseModel, Field

app = FastAPI()

class Student(BaseModel):
   id: int
   name :str = Field(None, title="name of student", max_length=10)
   subjects: List[str] = []

@app.post("/students/{college}")
async def student_data(college:str, age:int, student:Student):
   retval={"college":college, "age":age, **student.model_dump()}
   return retval

该函数将 college 和 age 参数的值与 Student 对象的字典表示一起添加,并将其作为响应返回。我们可以按如下方式检查 API 文档 −

FastAPI Request Body

可以看到,college 是 path 参数,age 是 query 参数,Student model 是请求体。