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

系列文章:

  FastAPI 学习之路(一)fastapi--高性能web开发框架

  FastAPI 学习之路(二)

  FastAPI 学习之路(三)

  FastAPI 学习之路(四)

  FastAPI 学习之路(五)

      FastAPI 学习之路(六)查询参数,字符串的校验

  FastAPI 学习之路(七)字符串的校验

    FastAPI 学习之路(八)路径参数和数值的校验

  FastAPI 学习之路(九)请求体有多个参数如何处理?

与使用 Query、Path 和 Body 在路径操作函数中声明额外的校验和元数据的方式相同,你可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。我们看一个简单的例子。

复制代码
from typing import Optional
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
    name: str
    description: Optional[str] = Field(
        None, title="这是描述", max_length=300
    )
    price: float = Field(..., gt=0, description="价格必须大于0")
    tax: Optional[float] = None
@app.put("/items/{itemid}")
async def update_items(itemid: int, item: Item = Body(..., embed=True)):
    results = {"itemid": itemid, "item": item}
    return results
复制代码

这里还是举的一个物品的价格,还打折的例子,我们对于描述和price用了Field,我们看下效果。我们用postman请求下。问可以看到item还是一个参数组

 

 

 那么我们看下我们代码中条件,假如,我们现在的价格小于0.

 

 我们可以看到,接口正常给我们返回了不应该小于0。我们可以看下接口文档

 

 

 

 Field 的工作方式和 Query、Path 和 Body 相同,包括它们的参数等等也完全相同。

 

        我们可以看下Field的源码。它里面是FieldInfo类实例化,然后校验。

 

 FieldInfo其实是继承了父类Representation,然后实现了对应的方法。

 

 

 那么我们在来看下boby,    Query、Path 方法,

 body,是一个方法,他是params的Query方法,

 

 我们在往下看,发下,params的body类。

 

 而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 中。

文章首发在公众号,欢迎关注。

posted @   北漂的雷子  阅读(1822)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示