FastAPI 额外数据类型详解:UUID、日期时间、timedelta 与更多高级类型

发布时间:2026/9/10 2:56:15

FastAPI 额外数据类型详解:UUID、日期时间、timedelta 与更多高级类型 FastAPI 额外数据类型详解UUID、日期时间、timedelta 与更多高级类型【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi导读本篇指南以 FastAPI 官方教程中的 额外数据类型Extra Data Types 一节为骨架系统讲解如何在路径参数、查询参数与请求体中使用UUID、datetime、date、time、timedelta、frozenset、bytes、Decimal等更复杂的数据类型。读完本文你将掌握这些类型在请求解析、响应序列化、校验与 OpenAPI 文档生成中的完整行为并能直接在自己的 API 项目中正确选用它们。为什么需要额外数据类型在此之前教程中演示的多是int、float、str、bool这类基础类型。但真实业务中接口经常需要表达商品的唯一 ID、订单的创建时间、一次任务的耗时、文件的二进制内容等语义更强的数据。如果全部退化成字符串或数字就会丢失类型信息校验、序列化和文档都会变得含糊。使用 FastAPI 声明这些额外类型后你依然能获得与基础类型完全一致的开发体验出色的编辑器支持类型提示、自动补全、静态检查来自请求数据的自动类型转换例如将请求体中的 ISO 8601 字符串转换为datetime对象响应数据的自动转换例如把timedelta序列化为总秒数自动数据校验格式非法时返回 422 校验错误自动注解与文档生成OpenAPI 中自动填充format等元信息。这些能力并非 FastAPI 自行实现而是基于 Pydantic 的字段类型系统FastAPI 在此基础上完成了请求/响应两侧的 JSON 编解码与 OpenAPI 模式生成。额外数据类型清单UUID含义标准通用唯一标识符广泛用作数据库与各类系统中的 ID。请求/响应表示在 JSON 中以str形式出现。声明方式直接用作路径参数或字段类型例如item_id: UUID。底层行为FastAPI 会将其校验为合法的 UUID v1~v5 格式非法字符串将触发 422 校验错误生成的 OpenAPI 模式中表现为type: string, format: uuid。datetime.datetime含义Python 标准库中的datetime.datetime。请求/响应表示ISO 8601 格式字符串例如2008-09-15T15:53:0005:00。附加价值一旦被解析为真实的datetime对象你就可以在视图函数内直接进行日期运算见下文示例。OpenAPI 模式type: string, format: date-time。datetime.date含义Python 标准库中的datetime.date。请求/响应表示ISO 8601 日期格式字符串例如2008-09-15无时间部分。OpenAPI 模式type: string, format: date。datetime.time含义Python 标准库中的datetime.time。请求/响应表示ISO 8601 时间格式字符串例如14:23:55.003。OpenAPI 模式type: string, format: time。datetime.timedelta含义Python 标准库中的datetime.timedelta表示一段时间差。请求/响应表示以总秒数的float出现。例如测试用例中的300秒即表示 5 分钟见 tests/test_tutorial/test_extra_data_types/test_tutorial001.py。序列化依据FastAPI 在 fastapi/encoders.py 中通过lambda td: td.total_seconds()将timedelta编码为总秒数。扩展说明Pydantic 还允许将其表示为ISO 8601 时间差编码OpenAPI 模式中对应format: duration如需自定义序列化方式可参考 Pydantic 自定义序列化器的相关文档。frozenset含义不可变的 Python 集合。请求侧JSON 数组会被读取为列表自动去重后转换为frozenset。响应侧序列化回 JSON 数组frozenset在 fastapi/encoders.py 中被映射为list。OpenAPI 模式生成的 JSON Schema 会通过uniqueItems明确标注集合内元素唯一。bytes含义Python 标准bytes。请求/响应表示按str处理。序列化依据在 fastapi/encoders.py 中通过lambda o: o.decode()解码为字符串。OpenAPI 模式声明为type: string且带binary格式。Decimal含义Python 标准Decimal高精度十进制数。请求/响应表示与float相同的方式处理。序列化依据在 fastapi/encoders.py 中的decimal_encoder会智能处理若无指数部分如Decimal(1)编码为int否则如Decimal(1.0)、Decimal(NaN)编码为float从而保证Numeric(x,0)这类场景能够正确往返。完整类型清单可进一步查阅 Pydantic 官方数据类型的文档Pydantic Data Types。完整示例在路径操作中使用额外类型以下是官方教程使用的示例对应源码 docs_src/extra_data_types/tutorial001_an_py310.py该示例定义了一个PUT操作路径参数使用UUID请求体通过Body()声明datetime、timedelta与可选的timefrom datetime import datetime, time, timedelta from typing import Annotated from uuid import UUID from fastapi import Body, FastAPI app FastAPI() app.put(/items/{item_id}) async def read_items( item_id: UUID, start_datetime: Annotated[datetime, Body()], end_datetime: Annotated[datetime, Body()], process_after: Annotated[timedelta, Body()], repeat_at: Annotated[time | None, Body()] None, ): start_process start_datetime process_after duration end_datetime - start_process return { item_id: item_id, start_datetime: start_datetime, end_datetime: end_datetime, process_after: process_after, repeat_at: repeat_at, start_process: start_process, duration: duration, }对于不使用Annotated语法的版本Python 3.10 以上同样可用仓库同时提供了 tutorial001_py310.py两者行为完全一致仅声明风格不同app.put(/items/{item_id}) async def read_items( item_id: UUID, start_datetime: datetime Body(), end_datetime: datetime Body(), process_after: timedelta Body(), repeat_at: time | None Body(defaultNone), ): ...注意其中几个要点请求体中的额外类型参数都用Body()显式标记repeat_at是可选的默认None因此它在 OpenAPI 的required列表中不会出现参数在函数内部保持其自然 Python 类型所以可以直接做日期运算例如start_process start_datetime process_after得到处理开始时间duration end_datetime - start_process得到处理耗时。请求与响应行为验证测试用例拆解仓库中针对该教程编写了自动化测试 tests/test_tutorial/test_extra_data_types/test_tutorial001.py同时参数化覆盖tutorial001_py310与tutorial001_an_py310两个源码变体可直接用于验证上述行为请求数据JSON{ start_datetime: 2018-12-22T14:00:0000:00, end_datetime: 2018-12-24T15:00:0000:00, repeat_at: 15:30:00, process_after: 300 }预期响应测试断言item_id原样回传start_process为2018-12-22T14:05:0000:00即开始时间加 300 秒duration为176100秒即两天多一点的耗时差。这直观印证了ISO 8601 字符串 →datetime→ 参与运算 → 再序列化为 ISO 8601 字符串timedelta300 秒→ 加法运算 → 结果序列化为总秒数float。OpenAPI 快照断言测试还校验了/openapi.json的输出其中路径参数item_id的模式为type: string, format: uuidstart_datetime、end_datetime为type: string, format: date-timerepeat_at为anyOf: [{type: string, format: time}, {type: null}]体现可选性process_after为type: string, format: durationrequired列表仅包含start_datetime、end_datetime、process_after。这说明 OpenAPI 文档生成是完全自动的无需手写任何模式注解。底层原理FastAPI 如何完成序列化所有额外类型在响应侧的序列化最终汇聚到 fastapi/encoders.py 中的ENCODERS_BY_TYPE字典fastapi/encoders.py它按类型注册了转换函数类型编码函数结果byteslambda o: o.decode()strdatetime.date/datetime.datetime/datetime.timeisoformat即o.isoformat()ISO 8601strdatetime.timedeltalambda td: td.total_seconds()float总秒数Decimaldecimal_encoder无指数时int否则floatfrozenset/setlistJSON 数组UUIDstr字符串形式的 UUID从源码结构可以推断请求侧的解析与校验由 Pydantic 的字段类型系统完成FastAPI 将路径、查询、请求体等来源的参数收集后交给 Pydantic 建模校验响应侧再借助ENCODERS_BY_TYPE将 Python 对象规范化为 JSON 可序列化值。这两条链路共同保证了声明即获得校验、序列化与文档的开发体验。使用建议与注意事项优先用强类型表达语义ID 用UUID、时间点用datetime、只关心日期用date、一天内的时刻用time、时间差用timedelta让 OpenAPI 文档与编辑器提示都能准确反映业务含义。timedelta的单位是秒客户端需要按总秒数可以是小数提交或解析例如300表示 5 分钟176100表示约 2 天 0 小时 55 分钟。datetime依赖python-multipart之外的纯标准库datetime、uuid均来自 Python 标准库无需额外安装依赖Decimal同理。校验失败返回 422当请求中的UUID格式非法、datetime字符串不符合 ISO 8601 时FastAPI 会返回包含ValidationError详情的 422 响应测试快照中可以看到该错误模式的完整结构。Annotated与默认值语法二选一即可新版推荐使用Annotated[type, Body()]风格旧式type Body(default...)依然可用且测试覆盖二者生成的请求体与文档完全一致。更多类型Pydantic 生态还提供 IP 地址、URL、枚举、秘密字符串等类型FastAPI 的ENCODERS_BY_TYPE中同样注册了对应编码如IPv4Address: str、SecretStr: str、Enum: lambda o: o.value等可按需查阅 fastapi/encoders.py 与 Pydantic 类型文档进一步扩展。小结额外数据类型让 FastAPI 接口从只有基础类型升级为任意丰富的领域类型且全程保持自动转换、自动校验与自动文档。通过本文的示例与测试证据可以看到声明UUID、日期时间族、timedelta、frozenset、bytes、Decimal后请求解析、函数内运算、响应序列化与 OpenAPI 模式生成全部开箱即用无需手写任何样板代码。【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 2:51:15

压力传感器最小二乘温度补偿:零位与灵敏度拟合实战

简介:面向压力传感器开发、测试与工业现场应用人员,这份资源提供基于最小二乘法的温度补偿算法实现,用来消除环境温度变化引起的传感器输出漂移,确保不同温度下测量数据的一致性。压缩包内仅含一个MATLAB脚本文件(m格式…

2026/9/10 2:51:15

信捷PLC与HMI在金属件非标打磨工作站的应用与调试要点

车间里那台金属件打磨工作站,从第一天通电调试到稳定量产,我前后在信捷PLC和HMI上花了不少精力。做非标设备的都懂,金属件打磨的难点从来不在单个动作,而在怎么把主轴、进给、压紧、除尘、安全联锁这些环节捏合成一套可靠的逻辑。…

2026/9/10 7:06:40

AI生成代码时代,能力断层如何弥补?Code to Learn训练闭环实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 7:06:40

RK3576开发板RTC完整配置指南:从内核到Android时区避坑

前阵子调一块RK3576开发板,功能问题都处理完了,结果客户那边反馈说设备重启后时间总是回到出厂值,日志时间戳全乱了。查了一圈,发现是RTC这块没配置干净。RK3576这颗芯片在AIoT和边缘计算项目里用得越来越多,配Linux或…

2026/9/10 7:06:40

AI文本太假怎么办?humanizer人性化改写实操指南

早上打开后台,看到一位读者的留言:“能不能出一篇关于 humanizer 的内容?我写文章基本都是 AI 帮我起草,但总觉得发出去的效果不对,说不出来哪里假。”这条留言让我挺有感触。做内容这行几年,我自己也被“A…

2026/9/10 7:01:40

T507平台适配长江存储EC150的工程级兼容性实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码