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

如何在Pydantic 2.5中验证FastAPI的GET参数(无需模型)

FastAPI + Pydantic 2.x 恢复GET参数正则校验的正确方式

针对你遇到的Pydantic 2.x升级后必填GET参数正则校验失效的问题,有两种可靠的解决方式,既能保持参数必填性,又能恢复正则校验:

方式一:Annotated + StringConstraints + Query

使用Annotated组合StringConstraints和Query,明确参数的校验规则与必填性:

from fastapi import FastAPI, Query
from pydantic import StringConstraints
from typing import Annotated

app = FastAPI()

# 示例正则:匹配16位十六进制字符串
MY_REGEX = r"^[a-f0-9]{16}$"

@app.get("/v1/app/end")
async def get_endpoint(
    foo: Annotated[str, StringConstraints(pattern=MY_REGEX), Query(...)],
):
    return {"foo": foo}

方式二:直接使用Query的pattern参数

FastAPI的Query对象本身支持pattern参数,无需额外引入Pydantic的约束类,写法更简洁:

from fastapi import FastAPI, Query

app = FastAPI()

MY_REGEX = r"^[a-f0-9]{16}$"

@app.get("/v1/app/end")
async def get_endpoint(
    foo: str = Query(..., pattern=MY_REGEX),
):
    return {"foo": foo}

原因说明

Pydantic 2.x调整了字段校验的触发逻辑,单独使用constr(pattern=...)或Annotated[str, StringConstraints(...)]作为查询参数类型时,FastAPI无法自动绑定校验规则。通过配合Query(...)(...表示参数必填),可以让FastAPI正确识别并执行正则校验,同时保留参数的必填属性。

测试验证:当传入不符合正则规则的foo参数时,接口会返回422状态码及校验错误信息,符合预期。

内容的提问来源于stack exchange,提问作者Ace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:10:00