文章目录

  • 1. response_model
  • 2. 添加输出模型
  • 3. 响应模型编码参数
  • 4. response_model_include 和 response_model_exclude
  • 5. 代码复用:继承
  • 6. Union
  • 7. 任意 dict 的响应
  • 8. 响应状态码
  • 9. 表单参数

learn from https://fastapi.tiangolo.com/zh/tutorial/response-model/

1. response_model

响应模型 不是 路径参数

from typing import Optional, List
from fastapi import Cookie, FastAPI, Header
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: Optional[str] = Noneprice: floattax: Optional[float] = Nonetags: List[str] = []@app.post("/items/", response_model=Item) # 装饰器方法的一个参数
async def create_items(item: Item):return item

or

@app.post("/items/", response_model=List[Item]) # 装饰器方法的一个参数
async def create_items(item: Item):return [item, item]

响应模型 对 返回的数据 进行转换,校验

例如:

from typing import Optional, List
from fastapi import Cookie, FastAPI, Header
from pydantic import BaseModel, EmailStrapp = FastAPI()class UserIn(BaseModel):username: strpassword: stremail: EmailStrfull_name: Optional[str] = None@app.post("/user/", response_model=UserIn) # 装饰器方法的一个参数
async def create_user(user: UserIn):return user

永远不要 存储用户的 明文密码,也不要在响应中 发送密码。

2. 添加输出模型

  • 输出的时候不给密码,更改响应模型为不带密码的
from typing import Optional, List
from fastapi import Cookie, FastAPI, Header
from pydantic import BaseModel, EmailStrapp = FastAPI()class UserIn(BaseModel):username: strpassword: stremail: EmailStrfull_name: Optional[str] = Noneclass UserOut(BaseModel):username: stremail: EmailStrfull_name: Optional[str] = None@app.post("/user/", response_model=UserOut) # 装饰器方法的一个参数
async def create_user(user: UserIn):return user


3. 响应模型编码参数

  • response_model_exclude_unset 参数 True,输出忽略 未明确设置的 字段
  • response_model_exclude_defaults=True,忽略跟默认值一样的字段
  • response_model_exclude_none=True,忽略 None 的字段
from typing import Optional, List
from fastapi import Cookie, FastAPI, Header
from pydantic import BaseModel, EmailStrapp = FastAPI()class Item(BaseModel):name: strdescription: Optional[str] = Noneprice: floattax: float = 10.5tags: List[str] = []items = {"foo": {"name": "Foo", "price": 50.2},"bar": {"name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2},"baz": {"name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": []},
}@app.get("/items/{item_id}", response_model=Item, response_model_exclude_unset=True)
async def read_item(item_id: str):return items[item_id]


如果参数 改为 False,或者 删除该参数,未设置的值 也显示出来了

4. response_model_include 和 response_model_exclude

它们接收一个由属性名称 str 组成的 set 来包含(忽略其他的)或者排除(包含其他的)这些属性

  • response_model_include, 只包含指定字段
  • response_model_exclude,排除指定字段
from typing import Optional, List
from fastapi import Cookie, FastAPI, Header
from pydantic import BaseModel, EmailStrapp = FastAPI()class Item(BaseModel):name: strdescription: Optional[str] = Noneprice: floattax: float = 10.5items = {"foo": {"name": "Foo", "price": 50.2},"bar": {"name": "Bar", "description": "The Bar fighters", "price": 62, "tax": 20.2},"baz": {"name": "Baz","description": "There goes my baz","price": 50.2,"tax": 10.5,},
}@app.get("/items/{item_id}/name",response_model=Item,response_model_include={"name", "description"}, # { } 表示 set, 使用 [ ] 也可以
)
async def read_item_name(item_id: str):return items[item_id]@app.get("/items/{item_id}/public", response_model=Item, response_model_exclude={"tax"})
async def read_item_public_data(item_id: str):return items[item_id]


5. 代码复用:继承

from typing import Optional
from fastapi import FastAPI
from pydantic import EmailStr, BaseModel
app = FastAPI()class UserIn(BaseModel):username: strpassword: stremail: EmailStrfull_name: Optional[str] = Noneclass UserOut(BaseModel):username: stremail: EmailStrfull_name: Optional[str] = Noneclass UserInDB(BaseModel):username: strhashed_password: stremail: EmailStrfull_name: Optional[str] = Nonedef fake_password_hasher(raw_password: str):return "supersecret" + raw_passworddef fake_save_user(user_in: UserIn):hashed_password = fake_password_hasher(user_in.password)user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)# 使用user_in的数据初始化UserInDB , 并添加hashed_password字段print("User saved! ..not really")return user_in_db@app.post("/user/", response_model=UserOut)
async def create_user(user_in: UserIn):user_saved = fake_save_user(user_in)return user_saved
  • 通过继承进行复用
from typing import Optional
from fastapi import FastAPI
from pydantic import EmailStr, BaseModel
app = FastAPI()class UserBase(BaseModel):username: stremail: EmailStrfull_name: Optional[str] = Noneclass UserIn(UserBase):password: strclass UserOut(UserBase):passclass UserInDB(UserBase):hashed_password: strdef fake_password_hasher(raw_password: str):return "supersecret" + raw_passworddef fake_save_user(user_in: UserIn):hashed_password = fake_password_hasher(user_in.password)user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)# 使用user_in的数据初始化UserInDB , 并添加hashed_password字段print("User saved! ..not really")return user_in_db@app.post("/user/", response_model=UserOut)
async def create_user(user_in: UserIn):user_saved = fake_save_user(user_in)return user_saved

6. Union

  • 响应将是 多种类型中的 任何一种
from typing import Optional, Union
class BaseItem(BaseModel):description: strtype: strclass CarItem(BaseItem):type = "car"class PlaneItem(BaseItem):type = "plane"size: intitems = {"item1": {"description": "All my friends drive a low rider", "type": "car"},"item2": {"description": "Music is my aeroplane, it's my aeroplane","type": "plane","size": 5,},
}@app.get("/items/{item_id}", response_model=Union[PlaneItem, CarItem])
async def read_item(item_id: str):return items[item_id]

7. 任意 dict 的响应

  • 对于事先不知道 key 的,可以直接定义字典及其 k, v 的类型
@app.get("/keyword-weights/", response_model=Dict[str, float])
async def read_keyword_weights():return {"foo": 2.3, "bar": 3.4}

8. 响应状态码

  • 装饰器函数内 使用 status_code 参数来声明用于响应的 HTTP 状态码
@app.get("/items/{item_id}", response_model=Union[PlaneItem, CarItem],status_code=208)
async def read_item(item_id: str):return items[item_id]


关于 HTTP 状态码

在 HTTP 协议中,你将发送 3 位数的数字状态码作为响应的一部分。

  • 100 及以上状态码用于「消息」响应。你很少直接使用它们。具有这些状态代码的响应不能带有响应体。

  • 200 及以上状态码用于「成功」响应。这些是你最常使用的。

    • 200 是默认状态代码,它表示一切「正常」。
    • 另一个例子会是 201,「已创建」。它通常在数据库中创建了一条新记录后使用。
    • 一个特殊的例子是 204,「无内容」。此响应在没有内容返回给客户端时使用,因此该响应不能包含响应体。
  • 300 及以上状态码用于「重定向」。具有这些状态码的响应可能有或者可能没有响应体,但 304「未修改」是个例外,该响应不得含有响应体。

  • 400 及以上状态码用于「客户端错误」响应。这些可能是你第二常使用的类型。

    • 一个例子是 404,用于「未找到」响应。
    • 对于来自客户端的一般错误,你可以只使用 400
  • 500 及以上状态码用于服务器端错误。你几乎永远不会直接使用它们。当你的应用程序代码或服务器中的某些部分出现问题时,它将自动返回这些状态代码之一。

from fastapi import FastAPI, status
status_code=status.HTTP_201_CREATED # 可以使用代码补全,不必记住

9. 表单参数

  • 接收的不是 JSON,而是表单字段时,要使用 Form
from fastapi import FastAPI, Form
app = FastAPI()@app.post("/login/")
async def login(username: str = Form(...),password: str = Form(...)):return {"username" : username}

fastapi 响应模型 / 响应状态码 / 表单参数相关推荐

  1. SpringMVC响应的HTTP状态码

    SpringMVC响应的HTTP状态码 SpringMVC 定义的状态码 常用到的状态码 2XX 200 OK 204 206 3XX 301 302 4XX 400 401 403 5XX 500 ...

  2. WEB阶段3:Response响应组成常见状态码ServletContexturl编码文件下载案例

    Response响应组成&常见状态码&ServletContext&url编码&文件下载案例 回顾 请求有哪三个的组成部分 请求行:提交方式 URI HTTP/1.1 ...

  3. python flask 设置 header 响应体、响应头、状态码

    需求场景 在api设计中,基于restful的设计原则,一个http的响应应该包含执行的响应信息以及状态码. 例如:一个错误信息的响应信息应该包含内容以及返回对应的设计错误码. 在flask中如何制定 ...

  4. SpringMVC自定义响应的HTTP状态码

    SpringMVC自定义响应的HTTP状态码有两种方法,一种是在返回方法上面加上@ResponseStatus注解,另一个种是在方法内部使用response.setStatus()方法. 注解方式: ...

  5. 什么是请求参数、表单参数、url参数、header参数、Cookie参数?一文讲懂

    最近在工作中对 http 的请求参数解析有了进一步的认识,写个小短文记录一下. 回顾下自己的情况,大概就是:有点点网络及编程基础,只需要加深一点点对 HTTP 协议的理解就能弄明白了. 先分享一个小故 ...

  6. SpringBoot重写拦截器导致无法接收Put请求表单参数

    有个项目,由于架构问题,开始没有重写拦截器,而在接口写了一大部分的时候(api是rest风格,主要使用get,post,put,delete,patch方法),发现有些功能需要在拦截器统一配置,于是才 ...

  7. Action 中接收表单参数的3种方法总结

    (1) Action 中使用属性接受参数 @ Action中需要包含与表单参数对应的setXxx()方法: @ 简单易用,但当表单参数较多时不太适用: (2)使用DomainModel( 域模型:系统 ...

  8. SpringMVC的简要介绍和表单参数的接收和时间参数的转换

    SpringMVC SpringMVC三大组件 DispatherServlet springMVC核心组件(中央处理器) 处理器映射器: 初始化配置文件,将所有的controller中@Reques ...

  9. Spring MVC PUT 表单参数获取

    默认的Spring MVC不支持put提交表单参数 加入以下配置在web.xml即可解决 <filter><filter-name>HttpMethodFilter</f ...

最新文章

  1. leetcode Merge Two Sorted Lists
  2. TensorFlow框架--Keras
  3. 【收藏】Hbase2.x协处理器的使用
  4. WinDbg实战调试命令笔记
  5. centOS 7设置静态IP,使用Xshell远程连接
  6. SAP C4C的URL Mashup无法添加到embedded component里去
  7. AcWing 211. 计算系数
  8. Linux C语言操作SQLite数据库
  9. XML序列之System.Xml.Serialization
  10. 【easy】101. Symmetric Tree
  11. libreoffice转换文件为pdf文件乱码问题解决办法
  12. 秒变金庸风 | NLP文本风格迁移
  13. Ubuntu下安装JRTPLIB
  14. 有重复组合公式及其证明方法
  15. 怎么将不可编辑的英文PDF文档翻译成中文
  16. win7拔掉耳机后电脑没声音了
  17. 深度学习第三天-卷积神经网络(CNN):乳腺癌识别
  18. 程序员必备画图技能之——流程图
  19. ExoPlayer官方中文使用文档
  20. matlab 内弹道程序,MATLAB内弹道程序 - 毕设专用!!!

热门文章

  1. Xadmin添加用户小组件出错
  2. JavaScript中的定时器
  3. Django 部署基础【使用 Nginx + uWSGI 的方式来部署来 Django】
  4. python解析xml数据_数据开发_Python解析XML文件
  5. mfc程序转化为qt_小峰的QT学习笔记
  6. 曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家
  7. HyperLogLog原理与在Redis中的使用
  8. 平衡小车卡尔曼滤波算法
  9. “指向指针的指针”的理解
  10. 受保护的属性无法直接读取