fastApi笔记09-响应模型

响应模型

可以在任意路径操作(get,post等)中使用response_model来声明用于返回响应模型

from typing import Anyfrom fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()class UserIn(BaseModel):username: strpassword: stremail: EmailStrfull_name: str | None = Noneclass UserOut(BaseModel):username: stremail: EmailStrfull_name: str | None = None@app.post("/user/", response_model=UserOut)
async def create_user(user: UserIn) -> Any:return user

需要注意response_model是[装饰器]方法(get,post等)的一个参数,不像之前参数和请求,它不属于路径操作函数

请求体使用UserIn,响应模型使用UserOut,未在输出模型声明的参数都会被过滤掉,示例响应模型会把请求体中的密码给过滤掉。

响应模型编码参数

from typing import List, Unionfrom fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: Union[str, None] = 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]@app.get("/items/{item_id}/name",response_model=Item,response_model_include={"name", "description"},
)
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]

在item_id都使用foo情况下

response_model_exclude_unset=True:响应会过滤默认值,只返回实际设置的值

{"name": "Foo","price": 50.2
}

response_model_include:需要传一个set(),只显示set中设置的值

{"name": "Foo","description": null
}

response_model_exclude:需要传一个set(),过滤set中设置的值

{"name": "Foo","description": null,"price": 50.2,"tags": []
}

通过继承减少重复

对用户模型来说尤其如此,因为:

  • 输入模型需要拥有密码属性。
  • 输出模型不应该包含密码。
  • 数据库模型很可能需要保存密码的哈希值。
from fastapi import FastAPI
from pydantic import BaseModel, EmailStrapp = FastAPI()class UserBase(BaseModel):username: stremail: EmailStrfull_name: str | None = 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)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

 可以先声明userBase为基础模型,然后创建继承该模型属性(类型声明,校验等)的子类,只要在子类中添加于基础模型不同的字段即可。

多个响应模型

可以将一个响应声明为两种类型的 Union,这意味着该响应将是两种类型中的任何一种

from typing import Unionfrom fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class BaseItem(BaseModel):description: strtype: strclass CarItem(BaseItem):type: str = "car"class PlaneItem(BaseItem):type: str = "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]

item_id传item1

{"description": "All my friends drive a low rider","type": "car"
}

item_id传item2

{"description": "Music is my aeroplane, it's my aeroplane","type": "plane","size": 5
}

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

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

相关文章

家庭装修的施工流程与工艺,新房装修的实用技术与方法

一、教程描述 对于第一次装修新房的朋友来说,做好装修的准备工作是非常必要的,起码应该了解新房装修的基本施工流程。家庭装修的施工顺序:1,购买材料开工进场;2,水电:开槽布线,铺设…

Samba文件夹有的能访问,有的不能解决办法(samba无法访问、samba文件夹打不开)需要把selinux设置为Permissive宽容模式

文章目录 如果有的目录能访问有的不能访问大概率是selinux设置了Enforcing强制模式需要把selinux设置为Permissive宽容模式或者Disabled禁用参考文章 如果有的目录能访问 有的不能访问 大概率是selinux设置了Enforcing强制模式 需要把selinux设置为Permissive宽容模式或者Di…

TYPE-C接口桌面显示器:视频与充电的双重革新

在现代科技的浪潮中,TYPE-C接口桌面显示器崭露头角,它不仅仅是一台显示器,更是充电与视频传输的完美融合。这种新型的显示器,凭借其TYPE-C接口,实现了从DC电源到PD协议充电的华丽转身,为众多设备如笔记本电…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Tile/Blur)

上篇文章介绍了y语义分割Seg,这篇文章介绍下Tile/Blur(增加/减少细节) Tile用于增加图片细节,一般用于高清修复,Blur用于减少图片细节(图片模糊),如下图,用Tile做修复&a…

【Vue渗透】Vue Devtools 浏览器插件

下载地址 Vue Devtools 浏览器插件 Vue站点渗透思路 【Vue渗透】Vue站点渗透思路 简介 Vue Devtools 是 Vue 官方发布的调试浏览器插件,可以安装在 Chrome 和 Firefox 等浏览器上,直接内嵌在开发者工具中,使用体验流畅。Vue Devtools 由…

HEVC视频编解码标准学习笔记-1

视频编解码标准H.265/HEVC(High Efficiency Video Coding)通过将视频数据编码为更高效格式,大幅改善了视频流的压缩效率。这里主要介绍Tile、Slice和CTU的定义,以及介绍这些技术组件之间的相互关系。 CTU(编码树单元&…

QPixmap入门学习

QPixmap是Qt中用于处理图片的类,可以加载、显示和操作图片。以下是几个常见的QPixmap的用法示例: 加载图片: from PyQt5.QtGui import QPixmap# 加载图片 pixmap QPixmap("image.jpg")显示图片: from PyQt5.QtWidgets …

Oracle19c 静默安装(OpenEuler)

一、概述 我一般都是用runInstaller和dbca的图形界面安装Oracle,但是这次安装,受到网络限制,不能用弹出窗口,只能用静默方式,还是使用这些可执行程序,不过要加一个 -silent 选项,参考了网上的文…

【蓝牙协议栈】btsnoop 概念介绍

1. btsnoop 概念介绍 btsnoop 用于记录蓝牙协议栈跟芯片交互的数据。在分析蓝牙问题的时候有很大的用途,能够快速定位问题所在,一般协议栈都有整合这个或者类似功能,否则我不认为这个协议栈是一个合格的协议栈,在 android 手机中…

AI时代显卡如何选择,B100、H200、L40S、A100、H100、V100 含架构技术和性能对比

AI时代显卡如何选择,B100、H200、L40S、A100、H100、V100 含架构技术和性能对比。 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑。 近期,AIGC领域呈现出一片繁荣景象&a…

可变参数、Collections类

一、可变参数 定义:是一种特殊的形参,定义在方法、构造器的形参列表里 格式:数据类型...参数名称 特点:可以不传数据,也可以传一个或者多个数据给它,也可以传一个数组 好处:可以灵活接收数据…

opencascade12解析

1.main.cpp #include "DisplayScene.h" #include "Viewer.h"// OpenCascade includes #include <BinXCAFDrivers.hxx> // 包含了用于处理 XCAF 数据的头文件 #include <STEPCAFControl_Reader.hxx> // 包含了用于读取 S…

探索无限维度的奥秘:Hilbert空间

当我们提到空间&#xff0c;你可能会立即想到周遭的环境——三维世界&#xff0c;其中事物可以向上或向下、左或右、前或后移动。然而&#xff0c;在数学和物理学的世界里&#xff0c;有一种抽象的空间概念&#xff0c;它不仅覆盖了我们的三维空间&#xff0c;还包括了更复杂的…

C++笔记:二叉搜索树(Binary Search Tree)

文章目录 二叉搜索树的概念二叉搜索树操作1. 框架搭建2. 遍历3. 查找迭代实现递归实现 4. 插入迭代实现递归实现 5. 删除迭代实现递归实现 6. 析构与销毁7. 拷贝构造与赋值重载 二叉搜索树的应用二叉搜索树的性能分析二叉搜索树模拟实现源码 二叉搜索树的概念 二叉搜索树又称二…

车载电子电器架构 —— 局部网络管理概述

车载电子电器架构 —— 局部网络管理概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

使用向量数据库pinecone构建应用01:相似语义检索 Semantic Search

Building Applications with Vector Databases 下面是DeepLearning.AI上面这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement…

【若依(ruoyi)】Java---如何在Apifox上传params参数--延伸--如何在Apifox上传Map类型参数

在使用若依开发过程中写接口的时候想在params中添加参数,但是使用params.key这种形式在后端是接收不到传过来的参数的,于是百般调研(百度),终于找到一个解决办法,就是在参数前后加上%5B和%5D,这两个参数会被编译为"["和"]",于是就对得上了,后端成功接受到参…

【前缀和】LCR 010. 和为 K 的子数组

LCR 010. 和为 K 的子数组 解题思路 创建一个前缀和数组 preSum&#xff0c;其长度比原数组 nums 多 1。preSum[i] 表示 nums 中前 i 个元素的和。通过遍历 nums 数组&#xff0c;计算前缀和数组 preSum。 在嵌套的两个循环中&#xff0c;对所有可能的子数组进行穷举&#xf…

代码随想录算法训练营29期Day61|LeetCode 739,496

文档讲解&#xff1a;每日温度 下一个更大元素I 739.每日温度 题目链接&#xff1a;https://leetcode.cn/problems/daily-temperatures/description/ 思路&#xff1a; 维护一个单调递减的栈就行了。 一次读取一个数组中的元素&#xff0c;将其与栈顶元素比较&#xff0c;如…

【尚硅谷】MybatisPlus 学习笔记(下)

目录 六、插件 6.1、分页插件 6.1.1、添加配置类 6.1.2、测试 6.2、xml自定义分页 6.2.1、UserMapper中定义接口方法 6.2.2、UserMapper.xml中编写SQL 6.2.3、测试 6.3、乐观锁 6.3.1、场景 6.3.2、乐观锁与悲观锁 6.3.3、模拟修改冲突 数据库中增加商品表 添加数…