当前位置:   article > 正文

全面拥抱 FastApi — 响应模型_fastapi模型

fastapi模型

大家好,我是村长~~ 今日 fastApi 干货来了,文末还有书籍赠送噢~~

fastApi 中可以定义请求体body模型,关于这部分内容可以查看之前的文章 地址:同样的,fastApi 支持在定义路径操作的时候,使用response_model 参数指明该路径的响应模型

其具有以下特点:

  • 转换为类型声明的输出数据

  • 响应数据的校验

  • 在 OpenAPI 路径操作中,为响应添加 JSON Schema

  • 生成 API 文档

其中,个人觉得最重要的一点是:把输出的数据字段限制在该模型以内!

而且,response_model 接收的类型与声明 Pydantic 模型属性的类型,语法完全相同

使用响应模型

先来看下简单的用法,定义一个响应模型 User

  1. from pydantic import BaseModel, EmailStr
  2. class User(BaseModel):
  3.     name: str
  4.     sex: str = "male"
  5.     age: int
  6.     email: EmailStr
  7.     phone: str

定义完模型之后,在路径操作装饰器函数中设置 response_model 参数,代码如下:

  1. from fastapi import FastAPI
  2. app = FastAPI()
  3. @app.post("/user/", response_model=User)
  4. async def create_user(user: User):
  5.     return user

运行代码,当收到客户端发来的请求后,根据用户的请求,返回对应用户的信息

响应模型参数

细心的朋友应该发现了,上面定义的 User 模型中,sex 是默认参数

但是有时候我们不需要返回未修改的或者为默认值的字段

例如,NoSQL 数据库的模型中往往包含很多可选属性,如果输出含默认值的属性,输出的 JSON 响应会特别长,此时,可以省略只含默认值的属性。

response_model_include

如果只有一个 Pydantic 模型, 但是在不同的接口中,因为某些需求不同,返回的 body 又不一样。

那么可以使用这种快捷方法来处理

在路径操作装饰器参数还有 response_model_includeresponse_model_exclude

其中,response_model_include 的作用是返回集合中指定(忽略其它属性)的属性内容

response_model_exclude 的作用是排除该集合中的其他字段属性(包含其它属性)

  1. items = {
  2.     "bar": {"name""Foo""age"25"email""xxx@qq.com""phone"123456},
  3. }
  4. @app.get(
  5.     "/items/{name_id}/name",
  6.     response_model=User,
  7.     response_model_exclude_unset=True,
  8.     response_model_include=['name''phone']
  9. )
  10. async def read_item_name(name_id: str):
  11.     return items[name_id]

这两个参数的值是都是由属性名 str 组成的 set

response_model_exclude_unset

在路径参数装饰器函数中,将 response_model_exclude_unset 设置为 True

响应中就不会再包含未修改过默认值的属性,而是只包含修改过值的字段

  1. items = {
  2.     "bar": {"name""Foo""age"25"email""xxx@qq.com""phone"123456},
  3. }
  4. @app.get(
  5.     "/items/{name_id}/name",
  6.     response_model=User,
  7.     response_model_exclude_unset=True
  8. )
  9. async def read_item_name(name_id: str):
  10.     return items[name_id]

可以看到,  response_model_exclude_unset 参数为 True 的时候,未修改的默认参数不会返回

反之,给默认值字段赋予了新的内容,则新的值会包含在返回的响应中 !

还有一种情况是: 赋的新值与默认值相同

例如下面 idbaz 的商品,

  1. class Item(BaseModel):
  2.     name: str
  3.     description: Optional[str] = None
  4.     price: float
  5.     tax: float = 10.5
  6.     tags: List[str] = []
  7. items = {
  8.     "foo": {"name""Foo""price"50.2},
  9.     "bar": {"name""Bar""description""The bartenders""price"62"tax"20.2},
  10.     "baz": {"name""Baz""description": None, "price"50.2"tax"10.5"tags": []},
  11. }
  12. @app.get(
  13.     "/items/{name_id}/name",
  14.     response_model=Item,
  15.     response_model_exclude_unset=True
  16. )
  17. async def read_item_name(name_id: str):
  18.     return items[name_id]

返回结果如下:

虽然 FastAPI 能够识别出 description、tax 和 tags 的值与默认值相同,这些值也会显式设置(而不是取自默认值)

送书

本周赠书:《Python机器学习》

本书适合实践于数据分析、信号处理等工程领域的读者,也适合在人工智能、机器学习领域进行理论学习和实践,希望筑牢数学基础的读者,以及正在进行线性代数课程学习的读者阅读。

规则

  1. 后台回复: 送书 ,参与抽奖
  2. 抽奖说明:
  3. 书籍是全部免费包邮送出!本意是送给有真正需要的人,同时也是读者福利,所以有以下几点说明:
  4. 1、参与者须关注公众号(同时仅限在本文右下角点击「点赞」的粉丝参与)
  5. 2、未点点赞的中奖者获奖无效
  6. 3、为了大家都能有拿书机会,同一位读者一个月内只有一本!

·················END·················

专业输出文本化表格的 Python 库,你值得拥有!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/898606
推荐阅读
相关标签
  

闽ICP备14008679号