fastapi 响应模型 / 响应状态码 / 表单参数

文章目录

    • 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}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java对象内存模型_Java对象的内存模型

众所周知,函数调用在内存中是通过压栈,退栈实现的,而Java的方法调用则是在JVM栈中通过栈帧实现的,且所有的Java对象都只在堆上分配内存.那么一个Java对象在堆内存里到底长啥样呢?实际上,当一个对…

fastapi 请求文件 / 表单 / 处理错误 / 路径操作配置 / jsonable_encoder

文章目录1. File 参数2. 多文件上传3. 请求表单与文件4. 处理错误5. 自定义响应头6. 自定义异常处理器7. 覆盖默认异常处理器8. 使用 RequestValidationError 的请求体9. 复用 FastAPI 异常处理器10. 路径操作参数配置10.1 status_code,tags10.2 summary&#xff0c…

fastapi PUT更新数据 / PATCH部分更新

文章目录1. PUT 更新2. 用 PATCH 进行部分更新learn from https://fastapi.tiangolo.com/zh/tutorial/body-updates/1. PUT 更新 注意,put 没有指定的值,会被重置为默认值 from typing import List, Optionalfrom fastapi import FastAPI from fastap…

Chrome 扩展 最近的历史 HistoryBar v1.1

说明 以前用过一段时间傲游浏览器,渐渐的习惯了它的鼠标手势和一些细微的人性化的功能。比方地址栏左边的“近期訪问的页面”button。能够方便的找到近期 20 条历史记录。 但后来因为某些原因又回到了 Chrome 的怀抱,于是就没有了这些不起眼但非常好用的…

LeetCode 2047. 句子中的有效单词数

文章目录1. 题目2. 解题1. 题目 句子仅由小写字母(a 到 z)、数字(0 到 9)、连字符(-)、标点符号(!、. 和 ,)以及空格( )组成。 每个句子可以根据空格分解成 …

LeetCode 2048. 下一个更大的数值平衡数(枚举)

文章目录1. 题目2. 解题1. 题目 如果整数 x 满足:对于每个数位 d ,这个数位 恰好 在 x 中出现 d 次。 那么整数 x 就是一个 数值平衡数 。 给你一个整数 n ,请你返回 严格大于 n 的 最小数值平衡数 。 示例 1: 输入&#xff1a…

LeetCode 2049. 统计最高分的节点数目(DFS)

文章目录1. 题目2. 解题1. 题目 给你一棵根节点为 0 的 二叉树 ,它总共有 n 个节点,节点编号为 0 到 n - 1 。 同时给你一个下标从 0 开始的整数数组 parents 表示这棵树,其中 parents[i] 是节点 i 的父节点。 由于节点 0 是根,所…

python源文件编码的含义_【原创】Python 源文件编码解读

以下内容源于对 PEP-0263 的翻译和解读,同时给出了一些网上网友的说法。 我是分割线 PEP 0263 -- Defining Python Source Code Encodings【摘要】给出声明 Python 源文件编码的语法。该编码信息后续会被 Python 解析器用于解析源文件。这种方式增强了对源文件中 U…

MyEclipse中SVN的常见的使用方法

本次主要内容: 一 、导入项目 (Checkout)。从svn资源库检出 二 、更新 (Update) 三、锁(对要修改的文件加锁,防止文件冲突) 四、提交(项目修改后的提交) 五、…

fastapi 路径依赖项Depends / 装饰器依赖dependencies / 全局依赖 / 带 yield 的依赖

文章目录1. 依赖项2. 类作为依赖3. 子依赖项3.1 多次使用同一个依赖项4. 路径操作装饰器依赖项5. 全局依赖项6. 带 yield 的依赖项7. 使用带 yield 上下文管理器作为依赖项learn from https://fastapi.tiangolo.com/zh/tutorial/dependencies/ 1. 依赖项 只能传给 Depends 一…

fastapi 安全性 / APIRouter / BackgroundTasks / 元数据 / 测试调试

文章目录1. 例子2. 获取当前用户3. 使用密码和 Bearer 的简单 OAuth24. 使用(哈希)密码和 JWT Bearer 令牌的 OAuth25. 多个应用文件5.1 APIRouter6. BackgroundTasks7. 元数据7.1 标题、描述和版本7.2 openapi_tags 标签元数据7.3 OpenAPI URL7.4 文档 …

java json path_Java使用JSONPath解析JSON完整内容详解

JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和PHP,Java。JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的js…

LeetCode 2050. 并行课程 III(拓扑排序)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n ,表示有 n 节课,课程编号从 1 到 n 。 同时给你一个二维整数数组 relations ,其中 relations[j] [prevCoursej, nextCoursej] ,表示课程 prevCoursej 必须在课程 nextCoursej 之前…

LeetCode 1521. 找到最接近目标值的函数值(位运算)

文章目录1. 题目2. 解题1. 题目 Winston 构造了一个如上所示的函数 func 。他有一个整数数组 arr 和一个整数 target ,他想找到让 |func(arr, l, r) - target| 最小的 l 和 r 。 请你返回 |func(arr, l, r) - target| 的最小值。 请注意, func 的输入参…

LeetCode 2053. 数组中第 K 个独一无二的字符串(哈希)

文章目录1. 题目2. 解题1. 题目 独一无二的字符串 指的是在一个数组中只出现过 一次 的字符串。 给你一个字符串数组 arr 和一个整数 k ,请你返回 arr 中第 k 个 独一无二的字符串 。 如果 少于 k 个独一无二的字符串,那么返回 空字符串 “” 。 注意…

LeetCode 2055. 蜡烛之间的盘子(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个长桌子,桌子上盘子和蜡烛排成一列。 给你一个下标从 0 开始的字符串 s ,它只包含字符 * 和 | ,其中 * 表示一个 盘子 ,| 表示一支 蜡烛 。 同时给你一个下标从 0 开始的二维整数数组 que…

策略模式java 用例_java策略模式简单用例

运用java策略模式一个小程序/****/package Strategy;import java.util.Arrays;/*** author HuangRong* Funtion 定义策略*/public interface ComputablesStra {public abstract void printForm();}/****/package Strategy;/*** author HuangRong* Function 为策略模式中的上下文…

LeetCode 2057. 值相等的最小索引

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums ,返回 nums 中满足 i mod 10 nums[i] 的最小下标 i ;如果不存在这样的下标,返回 -1 。 x mod y 表示 x 除以 y 的 余数 。 示例 1: 输入:num…

LeetCode 2058. 找出临界点之间的最小和最大距离(链表)

文章目录1. 题目2. 解题1. 题目 链表中的 临界点 定义为一个 局部极大值点 或 局部极小值点 。 如果当前节点的值 严格大于 前一个节点和后一个节点,那么这个节点就是一个 局部极大值点 。 如果当前节点的值 严格小于 前一个节点和后一个节点,那么这个…

LeetCode 2059. 转化数字的最小运算数(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums ,该数组由 互不相同 的数字组成。另给你两个整数 start 和 goal 。 整数 x 的值最开始设为 start ,你打算执行一些运算使 x 转化为 goal 。你可以对数字 x 重复执行下述运算&…