FastAPI - Request 请求主体
我们现在将使用 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() 函数。 在 schemas 部分下,将列出 Student 模型。
展开它前面的节点以显示模型的结构
点击Try it out按钮,在请求主体中填写测试值。
单击Execute执行按钮并获取服务器的响应值。
虽然 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 方法,并且有一个带有两个参数的请求主体。
也可以将操作函数声明为具有路径和/或查询参数以及请求正文。 让我们修改 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文档如下 −
可以看出,college是路径参数,age是查询参数,Student模型是请求主体。