FastAPI中Query参数约束未触发RequestValidationError是什么原因?
问题原因
你遇到的校验不生效问题是两个错误叠加导致的:
- 参数装饰器用错
Query仅用于校验URL?后面拼接的查询参数,你定义在路由路径/items/{item_id}里的item_id属于路径参数,必须用Path装饰器声明校验规则,Query不会对路径参数做任何校验。 - 校验参数名写错
FastAPI基于Pydantic做数值校验,大于等于的参数是ge而非gte,写无效的gte参数不会触发对应校验逻辑。
修正后的代码
from fastapi import FastAPI, HTTPException, Path from fastapi.exceptions import RequestValidationError from fastapi.responses import PlainTextResponse app = FastAPI() @app.exception_handler(RequestValidationError) async def validation_exception_handler(request, exc): return PlainTextResponse(str(exc), status_code=400) @app.get("/items/{item_id}") async def read_item(item_id: int = Path(ge=1)): if item_id == 3: raise HTTPException(status_code=418, detail="Nope! I don't like 3.") return {"item_id": item_id}
验证效果
修改后请求http://127.0.0.1:8000/items/0会直接返回400参数校验错误,符合你的预期。
内容的提问来源于stack exchange,提问作者user2652620
相关产品推荐
相关产品推荐

