FASTAPI系列 08-POST请求多参数

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请求体数据进行有效验证和处理。

更多内容,请关注公众号

+V lzq599220 送python测试开发视频全套资料 总共80G

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值