Fastapi 简明教程

FastAPI - Request Body

我们现在将使用 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 服务器并通过访问 [role="bare"] [role="bare"]http://localhost:8000/docs 在浏览器中打开 Swagger UI 文档。

文档会识别出 "/students/" 路由使用 POST 方法附加到 student_data() 函数。在 schemas 部分,Student 模型会被列出。

request1

展开其正前方的节点以揭示模型结构。

request2

单击 Try it out 按钮以在请求主体中填入测试值。

request3

单击 Execute 按钮以获取服务器的响应值。

request4

虽然 Pydantic 模型会自动填充请求主体,但也可以使用单值向其添加属性。为此,我们需要使用 Body 类对象作为要进行装饰的操作函数的参数。

首先,我们需要从 fastapi 导入 Body 类。如以下示例中所示,在 @app.post() 装饰符下,将 'name' 和 'marks' 声明为 student_data() 函数定义中的 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 方法,并且有一个带有两个参数的请求主体。

request5

还可以声明一个操作函数具有路径和/或查询参数以及请求体。让我们修改 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

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

request6

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