FastAPI 学习之路(十)请求体的字段
系列文章:
FastAPI 学习之路(一)fastapi--高性能web开发框架
与使用 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 中。
文章首发在公众号,欢迎关注。
最新文章
- visual stdio 2015安装配置及原理
- 一个section刷新 一个cell刷新
- js 选项卡实现
- Android Handler简单示例
- 搜索浅谈(Elasticsearch和Lucene4分享)
- Oracle基础<;1>;--数据库设计
- 用户 IIS APPPOOL\DefaultAppPool 登录失败的解决方法
- [liu yanling]测试用例作用
- iOS9新特性-3D Touch
- Java学习笔记--链表
- NLTK学习笔记(一):语言处理和Python
- poj 2318 叉积+二分
- LOJ #2048. 「HNOI2016」最小公倍数
- Log4net(三)——RollingFileAppender配置
- 如何在 sublime text 中以当前文件目录打开 cmd
- 20 KMP匹配的Next值和Nextval值
- as3.0去除空格
- 解决:Host xxx.xxx.xxx.xxx is blocked because of many connection errors.
- AWS系列-创建 IAM 用户
- ViewPager中的子Activity无法响应OnActivityResult的解决方法