FastAPI中空请求参数如何使用默认值避免422错误?
解决FastAPI升级后空Query参数触发422错误的问题
FastAPI从0.63.0升级到0.95.2后,依赖的Pydantic版本对参数校验逻辑做了严格调整——旧版本会将空字符串形式的Query参数(如limit=)视为「参数未提供」,自动使用默认值;而新版本会将空字符串作为实际传入值,尝试转换为指定类型(这里是int)时失败,触发422 Unprocessable Entity错误。
以下是几种可行的解决方案:
方案一:在函数内部处理空字符串
直接将参数类型设为Union[int, str],在函数内判断并转换空字符串为默认值:
from typing import Union, List, Dict, Any from fastapi import Query async def get_list( # 其他参数... limit: Union[int, str] = Query(10, lt=max_int_value), # 其他参数... ) -> List[Dict[str, Any]]: # 处理空字符串场景 if isinstance(limit, str) and limit.strip() == "": limit = 10 else: # 确保转换为整数(Query已做范围校验,这里仅处理类型转换) limit = int(limit) # 后续业务逻辑...
方案二:使用Pydantic验证器自动转换
通过Pydantic的BeforeValidator在类型转换前处理空字符串,逻辑更优雅:
from typing import List, Dict, Any from fastapi import Query from pydantic import BeforeValidator def empty_str_to_default(value, field_info): # 若传入空字符串,返回参数默认值 if value == "": return field_info.default return value async def get_list( # 其他参数... limit: int = Query( 10, lt=max_int_value, before=BeforeValidator(empty_str_to_default), pre=True # 确保验证器在类型转换前执行 ), # 其他参数... ) -> List[Dict[str, Any]]: # 后续业务逻辑...
方案三:自定义依赖项封装逻辑
将参数处理逻辑封装为独立依赖,适合多个接口复用的场景:
from typing import Optional, List, Dict, Any from fastapi import Query, Depends def parse_limit(limit: Optional[str] = Query(None, lt=max_int_value)) -> int: if limit is None or limit.strip() == "": return 10 return int(limit) async def get_list( # 其他参数... limit: int = Depends(parse_limit), # 其他参数... ) -> List[Dict[str, Any]]: # 后续业务逻辑...
内容的提问来源于stack exchange,提问作者voilalex
相关产品推荐
相关产品推荐

