FastAPI路由动态路径参数如何在定义层实现end>start的校验
完全可以实现,推荐两种常用的落地方式,都能让校验逻辑在进入路由函数前执行:
方案1:依赖注入挂载全局校验
直接把跨参数校验逻辑封装为独立依赖,在路由定义时通过dependencies参数挂载,完全不需要修改原有路由函数的业务逻辑:
- 定义校验依赖函数
from fastapi import Depends, HTTPException, status, Path def validate_start_end_range(start: int = Path(ge=1), end: int = Path(ge=1)): if end <= start: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="end must be greater than start" )
- 修改路由定义挂载依赖
route1 = router.get( "/start={start:int}/end={end:int}", dependencies=[Depends(validate_start_end_range)] )(route1_func)
- 原有路由函数可直接移除内部校验逻辑
async def route1_func(request: Request, start: int = Path(..., title="my start", ge=1), end: int = Path(..., title="my end", ge=1)): return True
方案2:Pydantic模型封装跨字段校验
把关联的路径参数封装为单个Pydantic模型,通过模型的根校验规则实现联动校验,FastAPI会自动在参数解析阶段完成校验:
- 定义参数校验模型
from pydantic import BaseModel, model_validator, Path class PathParams(BaseModel): start: int = Path(..., title="my start", ge=1) end: int = Path(..., title="my end", ge=1) @model_validator(mode="after") def check_end_gt_start(self): if self.end <= self.start: raise ValueError("end must be greater than start") return self
- 修改路由函数直接接收封装模型
from fastapi import Annotated async def route1_func(request: Request, path_params: Annotated[PathParams, Path()]): # 直接通过path_params.start、path_params.end取值即可 return True
如果需要把校验失败的默认返回码422改为400,自定义一个Pydantic验证错误的全局异常处理器即可。
内容的提问来源于stack exchange,提问作者Avishay Cohen
相关产品推荐
相关产品推荐

