FASTAPI系列 08-POST请求多参数
文章目录
前言
本章中,我将讲解多个请求体参数(两个 Pydantic 模型参数)
+V lzq599220 送python测试开发视频全套资料 总共80G
一、多个请求体参数
在上一章,我讲解了单个请求体的body,如下:
{
"book_name":"python",
"book_author":"Teacher Li",
"book_price":10.00,
"description":"books description"
}
下面,我将讲解多个请求体参数的用法, 新增一个user模型
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
# 创建book模型
class Book(BaseModel):
book_name: str
book_author: str
book_price: float
description: Optional[str] = None
class User(BaseModel):
user_name: str
user_email: str
app = FastAPI()
@app.post("/books/{book_id}")
async def update_book(book_id: int, book: Book, user: User):
results = {"book_id": book_id, "book": book, "user": user}
return results
if __name__ == '__main__':
uvicorn.run(app)
这段代码提供了一个API接口,允许用户以POST方法向指定书籍ID的路径发送请求来更新书籍信息,同时需要在请求体中附带书籍的具体信息(book_name, book_author, book_price, description)以及操作用户的个人信息(user_name, user_email);
在这种情况下,FastAPI 将注意到该函数中有多个请求体参数(两个 Pydantic 模型参数)。因此,它将使用参数名称作为请求体中的键(字段名称),并期望一个类似于以下内容的请求体:
{
"book":{
"book_name":"python",
"book_author":"Teacher Li",
"book_price":10.00,
"description":"books description"
},
"user":{
"user_name":"Teacher_Li",
"user_email":"Teacher_Li@qq.com"
}
}
注意,即使 book的声明方式与之前相同,但现在它被期望通过 book键内嵌在请求体中。FastAPI 将自动对请求中的数据进行转换,因此 book参数将接收指定的内容,user 参数也是如此。它将执行对复合数据的校验。
二、请求体中的单一值
为了扩展先前的模型,你可能决定除了 book和 user 之外,还想在同一请求体中具有另一个键 introduction。如果你就按原样声明它,因为它是一个单一值,FastAPI 将假定它是一个查询参数。
但是你可以使用 Body 指示 FastAPI 将其作为请求体的另一个键进行处理。
@app.post("/books/{book_id}")
async def update_book(book_id: int, book: Book, user: User, introduction: str = Body(...)):
results = {"book_id": book_id, "book": book, "user": user, "introduction": introduction}
return results
在这种情况下,FastAPI 将期望像这样的请求体:
{
"book":{
"book_name":"python",
"book_author":"Teacher Li",
"book_price":10.00,
"description":"books description"
},
"user":{
"user_name":"Teacher_Li",
"user_email":"Teacher_Li@qq.com"
},
"introduction": "This is a book "
}
同样的,它将转换数据类型,校验,生成文档等。
三、嵌入单个请求体参数
假设你只有一个来自 Pydantic 模型 Book的请求体参数 book。默认情况下,FastAPI 将直接期望这样的请求体。但是,如果你希望它期望一个拥有 book键并在值中包含模型内容的 JSON,就像在声明额外的请求体参数时所做的那样,则可以使用一个特殊的 Body 参数 embed:
book: Book= Body(..., embed=True)
代码修改如下:
@app.post("/books/{book_id}")
async def update_book(book_id: int, book: Body(..., embed=True), user: User, introduction: str = Body(...)):
results = {"book_id": book_id, "book": book, "user": user, "introduction": introduction}
return results
在这种情况下,FastAPI 将期望像这样的请求体:
{
"book":{
"book_name":"python",
"book_author":"Teacher Li",
"book_price":10.00,
"description":"books description"
}
}
总结
文章强调了FastAPI在处理多个请求体参数时的灵活性和便利性,特别是通过结合使用Pydantic模型与Body装饰器,可以方便地对接收复杂且结构化的POST请求体数据进行有效验证和处理。