FastAPI 学习之路(十)请求体的字段(下)

本文探讨了FastAPI框架中Query、Path等参数类与FieldInfo及Representation类的关系,揭示了它们之间的继承结构及其如何作用于API路径操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

而Body的父类就是FieldInfo。和我们上面的Field一样,只不过Field是直接使用的FieldInfo,body只是上面两层做 了简单的封装,其实都是FieldInfo。

我们看下query

然后看到这里可能就发现下面就是一个Query类,

  它是集成了Param类,Param类才是集成了FieldInfo类。

我们看下path

它也是params里面的Path类,

然后Param继承了FieldInfo方法。

其实他们的共同的父类就是Representation。

从上面的代码一顿跳转,我们就能看出来,他们最后的根都是Representation,只是上面的boby,    Query、Path方法的父类都是直接或者间接的继承FieldInfo,而Field就是FieldInfo的实例化,FieldInfo继承了Representation,它们本质上就是Representation类的子类。所以他们几个的使用方法,和使用参数没有太大的区别。

       请记住当你从 fastapi 导入 Query、Path 等对象时,他们实际上是返回特殊类的函数。

       你可以在 Field、Query、Body 中声明额外的信息。这些信息将包含在生成的 JSON Schema 中。

### FastAPI请求体的使用方法 在 FastAPI 中,请求体通常通过 `Pydantic` 模型来定义和验证。以下是关于如何处理请求体的具体说明以及示例。 #### 定义请求体模型 为了声明请求体,可以使用 `Pydantic` 提供的 `BaseModel` 类创建数据模型。这些模型不仅用于描述数据结构,还能够提供自动化的数据验证功能[^1]。 ```python from pydantic import BaseModel class Item(BaseModel): name: str description: str | None = None price: float tax: float | None = None ``` 上述代码片段展示了如何定义一个名为 `Item` 的模型,该模型包含了四个字段:`name`(必需)、`description`(可选,默认为 `None`)、`price`(必需)和 `tax`(可选,默认为 `None`)。此模型可用于解析 JSON 数据并将其映射到 Python 对象中。 #### 处理 POST 请求中的请求体 当需要接收来自客户端的复杂数据时,可以通过函数参数指定对应的 `Pydantic` 模型作为输入类型。FastAPI 将自动读取 HTTP 请求正文中的 JSON 数据,并尝试将其解码为所定义的模型实例。 ```python from fastapi import FastAPI app = FastAPI() @app.post("/items/") async def create_item(item: Item): return item ``` 在此例子中,`create_item` 函数接受了一个类型为 `Item` 的参数 `item`。这意味着每当调用 `/items/` 路由时,FastAPI 都会期望接收到符合 `Item` 结构的有效 JSON 数据。 #### 嵌套请求体的支持 如果希望将整个对象嵌入另一个键下,则需调整前端发送的数据格式。在这种情况下,即使后端保持相同的模型定义不变,也需要确保传来的 JSON 是按照特定形式组织的。例如: 假设我们有一个如下所示的新路由: ```python @app.put("/complex-item/") async def update_complex_item(complex_data: dict): inner_item = complex_data["item"] return {"received": inner_item} ``` 此时,客户端应提交形如 `{ "item": {...} }` 这样的 JSON 数据,其中内部的对象遵循之前定义好的 `Item` 模型规则[^3]。 #### 综合应用案例 下面给出一个更完整的综合应用场景,它结合了路径参数、查询字符串参数请求体一起使用的场景[^4]: ```python from fastapi import FastAPI, Query from typing import Optional app = FastAPI() fake_db = {} @app.post("/products/{category}/") async def add_product( category: str, product_name: str = Query(..., min_length=3), details: Item ): key = f"{category}-{product_name}" fake_db[key] = details.dict() return {"status": "success", "stored_key": key} ``` 在这个样例里,除了常规的请求体外,还有两个其他类型的参数被引入——一个是 URL 路径的一部分 (`category`);另一个是从查询串提取出来的值(`product_name`)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值