如何在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
相关产品推荐
相关产品推荐

