FastAPI - 请求体
我们现在将使用 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。
展开其前面的节点以显示 model 的结构。
点击 Try it out 按钮,在请求体中填写测试值。
点击 Execute 按钮并获取服务器的响应值。
虽然 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 方法,并具有两个参数的请求体。
也可以声明一个操作函数,同时具有 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 文档 −
可以看到,college 是 path 参数,age 是 query 参数,Student model 是请求体。