FastAPI - 请求正文


我们现在将使用 Pydantic 模型对象作为客户端请求的请求主体。正如前面提到的,我们需要使用 POST 操作装饰器来达到目的。

import uvicorn
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 类的对象作为 Body 参数。要测试此路由,请启动 Uvicorn 服务器并通过访问 http://localhost:8000/docs 在浏览器中打开 Swagger UI 文档

文档指出“/students/”路由附加有带有POST方法的student_data()函数。在模式部分下,将列出学生模型。

FastAPI 请求正文

展开前面的节点以显示模型的结构

FastAPI 请求正文

单击尝试按钮以在请求正文中填写测试值。

FastAPI 请求正文

单击“执行”按钮并获取服务器的响应值。

FastAPI 请求正文

虽然 Pydantic 模型自动填充请求正文,但也可以使用奇异值向其添加属性。为此,我们需要使用Body类对象作为要修饰的操作函数的参数。

首先,我们需要从fastapi导入 Body 类。如以下示例所示,在@app.post()装饰器下面的Student_data()函数定义中将“name”和“marks”声明为 Body 参数。

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

如果我们检查 Swagger UI 文档,我们应该能够找到与 Student_data() 函数关联的这个 POST 方法,并且有一个带有两个参数的请求正文。

FastAPI 请求正文

还可以声明一个操作函数,使其具有路径和/或查询参数以及请求正文。让我们修改 Student_data() 函数,将路径参数“college”、“age”作为查询参数,将 Student 模型对象作为主体参数。

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

该函数将大学和年龄参数的值与 Student 对象的字典表示形式相加,并将其作为响应返回。我们可以检查 API 文档如下 -

FastAPI 请求正文

可以看出,college是路径参数,age是查询参数,Student模型是请求体。