FastAPI中为Swagger UI的时间范围查询参数设置动态默认值
解决FastAPI中Swagger UI动态日期默认值的问题
要实现from_date(默认上周)和to_date(默认今日)在Swagger UI中自动更新,需要同时处理后端逻辑的动态默认值,以及修改OpenAPI规范让Swagger UI每次加载都获取最新日期。
实现步骤
处理后端动态默认值:
先定义函数计算动态日期,在路径操作函数中判断用户是否传递参数,未传递时使用动态计算的值。自定义OpenAPI规范生成逻辑:
重写FastAPI的OpenAPI生成方法,每次生成规范时动态更新参数的默认值,确保Swagger UI显示最新日期。
完整代码示例
from fastapi import FastAPI, Query from datetime import datetime, timedelta from fastapi.openapi.utils import get_openapi app = FastAPI() def get_dynamic_dates(): """计算动态日期:上周和今日,返回ISO格式字符串""" today = datetime.today().date() last_week = today - timedelta(days=7) return last_week.isoformat(), today.isoformat() @app.get("/data") def fetch_data( from_date: str = Query(None, description="起始日期,默认值为上周"), to_date: str = Query(None, description="结束日期,默认值为今日") ): # 若用户未传参数,使用动态计算的日期 default_from, default_to = get_dynamic_dates() final_from = from_date or default_from final_to = to_date or default_to # 这里替换为你的业务逻辑 return {"查询起始日期": final_from, "查询结束日期": final_to} def custom_openapi(): """自定义OpenAPI规范,动态更新参数默认值""" if app.openapi_schema: return app.openapi_schema # 生成基础OpenAPI规范 openapi_schema = get_openapi( title="动态日期默认值API", version="1.0.0", description="自动更新Swagger UI日期默认值的示例API", routes=app.routes, ) # 获取最新的动态日期 from_default, to_default = get_dynamic_dates() # 遍历路径,更新目标参数的默认值 for path_details in openapi_schema["paths"].values(): if "get" in path_details: get_operation = path_details["get"] if "parameters" in get_operation: for param in get_operation["parameters"]: if param["name"] == "from_date": param["default"] = from_default elif param["name"] == "to_date": param["default"] = to_default # 缓存更新后的规范(可选,避免重复计算) app.openapi_schema = openapi_schema return app.openapi_schema # 替换默认的OpenAPI生成方法 app.openapi = custom_openapi
效果说明
- 启动服务后,访问
/docs打开Swagger UI,from_date会自动显示上周的日期,to_date显示今日日期。 - 次日刷新Swagger UI,默认值会自动更新为新的日期,无需重启服务器。
- 后端逻辑也会在用户未传递参数时,自动使用最新的动态日期,保证前后端行为一致。
内容的提问来源于stack exchange,提问作者ndueck
相关产品推荐
相关产品推荐

