FastAPI中如何用dd.mm.YYYY格式日期实现输入输出验证
解决方案:FastAPI中统一处理
dd.mm.YYYY格式的日期输入与输出 你可以利用Pydantic的Annotated结合验证器和序列化器,实现一个可同时用于输入验证和输出格式化的日期类型,无需自行编写复杂的独立类。以下是具体实现:
1. 导入依赖模块
from pydantic import BaseModel, BeforeValidator, PlainSerializer from datetime import datetime, date from typing import Annotated, Dict from fastapi import FastAPI, Body, Annotated as FastAPIAnnotated
2. 定义日期处理逻辑
编写两个辅助函数:一个用于解析输入的dd.mm.YYYY字符串为date对象,另一个用于将date对象序列化为指定格式的字符串:
def parse_ddmmyyyy_date(value: str) -> date: try: return datetime.strptime(value, "%d.%m.%Y").date() except ValueError: raise ValueError(f"无效日期格式,需为'dd.mm.YYYY',当前输入:{value}") def serialize_ddmmyyyy_date(value: date) -> str: return value.strftime("%d.%m.%Y")
3. 创建自定义日期类型
用Annotated包装date类型,同时绑定输入验证器和输出序列化器:
Date_dd_mm_YYYY = Annotated[ date, BeforeValidator(parse_ddmmyyyy_date), PlainSerializer(serialize_ddmmyyyy_date, return_type=str), ]
4. 应用到Schema和API中
完全贴合你期望的代码结构:
class MyTestSchema(BaseModel): date: Date_dd_mm_YYYY # 其他字段示例 description: str class MyTestClass: @classmethod def my_test_func(cls, data: MyTestSchema) -> Dict[Date_dd_mm_YYYY, str]: # 业务逻辑示例:返回以日期为键的字典 return {data.date: f"已处理{data.date}的相关数据"} app = FastAPI() @app.post("/test") def my_test_api(data: FastAPIAnnotated[MyTestSchema, Body()]) -> Dict[Date_dd_mm_YYYY, str]: return MyTestClass.my_test_func(data)
工作原理说明
- 输入验证:API接收请求时,Pydantic自动调用
parse_ddmmyyyy_date函数,将传入的字符串解析为date对象,若格式不符合dd.mm.YYYY则抛出验证错误。 - 输出序列化:API返回响应时,Pydantic调用
serialize_ddmmyyyy_date函数,将date对象格式化为dd.mm.YYYY字符串,作为字典的键返回。 - 类型标注兼容性:自定义的
Date_dd_mm_YYYY类型既可以用于BaseModel的字段定义,也可以作为函数返回值的类型标注,完全满足你的需求。
测试验证
- 发送POST请求到
/test,请求体示例:{ "date": "15.08.2024", "description": "测试请求" } - 响应示例:
{ "15.08.2024": "已处理15.08.2024的相关数据" } - 若传入错误格式的日期(如
2024-08-15),API会返回422验证错误,提示格式不符合要求。
内容的提问来源于stack exchange,提问作者Serg Lihodkin
相关产品推荐
相关产品推荐

