FastAPI路由:添加动态路径参数验证
FastAPI route: Adding dynamic path parameters validation
我正在尝试在 fastapi 服务器中为我的路由添加验证,按照说明 here 并设法在我的 int 路径参数上添加了验证,如下所示:
route1 = router.get("/start={start:int}/end={end:int}")(route1_func)
和我的 route1_func
:
async def route1_func(request: Request,
start: int = Path(..., title="my start", ge=1),
end: int = Path(..., title="my end", ge=1)):
if end <= start:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST)
else:
return True
这很好用...但是我想验证 end > start
如果可能的话作为定义的一部分,而不是在进入 route1_func
之后检查它
这可能吗?
您可以将路径参数和查询参数放在 Pydantic class 中,然后将整个 class 添加为函数参数,并在其后添加 = Depends()
。 FastAPI 文档几乎没有提及此功能,但它确实有效。
然后,一旦你在 Pydantic class 中有了你的参数,你就可以轻松地使用 Pydantic 验证器进行自定义验证。
这是您的用例的粗略介绍:
class Route1Request(BaseModel):
start: int = Query(..., title="my start", ge=1)
end: int = Query(..., title="my end", ge=1)
@root_validator
def verify_start_end(cls, vals: dict) -> dict:
assert vals.get("end", 0) > vals.get("start", 0)
return vals
@router.get("/")
async def route1(route1_data: Route1Request = Depends()):
return True
注意:我不清楚您是要使用路径参数还是查询参数。我为 Query
参数编写了这个示例,但它可以与 Path
参数一起使用,只需进行一些更改。
您可以将验证器函数用作依赖项。函数参数必须与路径中相同
def check(start: int, end: int):
print(start, end)
if start > end:
raise HTTPException(status_code=400, detail='error message')
@router.get('/{start}/{end}', dependencies=[Depends(check)])
async def start_end(
start: int,
end: int
):
return start, end
我正在尝试在 fastapi 服务器中为我的路由添加验证,按照说明 here 并设法在我的 int 路径参数上添加了验证,如下所示:
route1 = router.get("/start={start:int}/end={end:int}")(route1_func)
和我的 route1_func
:
async def route1_func(request: Request,
start: int = Path(..., title="my start", ge=1),
end: int = Path(..., title="my end", ge=1)):
if end <= start:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST)
else:
return True
这很好用...但是我想验证 end > start
如果可能的话作为定义的一部分,而不是在进入 route1_func
这可能吗?
您可以将路径参数和查询参数放在 Pydantic class 中,然后将整个 class 添加为函数参数,并在其后添加 = Depends()
。 FastAPI 文档几乎没有提及此功能,但它确实有效。
然后,一旦你在 Pydantic class 中有了你的参数,你就可以轻松地使用 Pydantic 验证器进行自定义验证。
这是您的用例的粗略介绍:
class Route1Request(BaseModel):
start: int = Query(..., title="my start", ge=1)
end: int = Query(..., title="my end", ge=1)
@root_validator
def verify_start_end(cls, vals: dict) -> dict:
assert vals.get("end", 0) > vals.get("start", 0)
return vals
@router.get("/")
async def route1(route1_data: Route1Request = Depends()):
return True
注意:我不清楚您是要使用路径参数还是查询参数。我为 Query
参数编写了这个示例,但它可以与 Path
参数一起使用,只需进行一些更改。
您可以将验证器函数用作依赖项。函数参数必须与路径中相同
def check(start: int, end: int):
print(start, end)
if start > end:
raise HTTPException(status_code=400, detail='error message')
@router.get('/{start}/{end}', dependencies=[Depends(check)])
async def start_end(
start: int,
end: int
):
return start, end