You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:40:32