如何在 FastAPI 中定义具有不同路径但相同路径参数的多个 API 端点?
- 2025-01-07 08:44:00
- admin 原创
- 107
问题描述:
我正在开发一个使用 FastAPI 的项目。我的路由器文件如下所示:
# GET API Endpoint 1
@router.get("/project/{project_id}/{employee_id}")
async def method_one(
project_id: str, organization_id: str, session: AsyncSession = Depends(get_db)
):
try:
return await CustomController.method_one(
session, project_id, employee_id
)
except Exception as e:
return custom_exception_handler(e)
# GET API Endpoint 2
@router.get("/project/details/{project_id}")
async def method_two(
project_id: str, session: AsyncSession = Depends(get_db)
):
try:
return await CustomController.method_two(
session=session, project_id=project_id
)
except Exception as e:
return custom_exception_handler(e)
# GET API Endpoint 3
@router.get("/project/metadata/{project_id}")
async def method_three(
project_id: str, session: AsyncSession = Depends(get_db)
):
try:
return await CustomController.method_three(
session=session, project_id=project_id
)
except Exception as e:
return custom_exception_handler(e)
这里工作流的明显期望是:当每个 API 端点都使用其所需的路径参数触发时,就会执行控制器方法,如其主体中所定义的那样。
然而,由于某些奇怪的原因,当 API 端点 2 和 3 被触发时,它们正在执行端点 1 中的控制器方法,即CustomController.method_one()
。
在路由器的print()
方法中添加一些语句后,我发现在调用 API 端点 2 时会调用该方法,而实际上应该在路由器中调用该方法。API 端点 3 的情况也是如此。method_one()
`method_one()`method_two()
method_one()
当 API 端点 2 和 3 被触发时,我无法理解为什么会执行方法主体。我是否遗漏了配置中的某些内容,或者其他什么 - 有人可以纠正我吗?谢谢!
解决方案 1:
在 FastAPI 中,正如本答案所述,由于端点是按顺序评估的(请参阅 FastAPI 关于顺序的重要性),因此它确保/project/{project_id}/...
首先评估您在应用程序中首先定义的端点(在本例中即 —)。因此,每次调用其他两个端点之一(即 和/project/details/...
)时,都会使用或 作为参数/project/metadata/...
触发第一个端点。details
`metadata`project_id
解决方案
因此,你需要确保在 之前声明了另外两个端点/project/{project_id}/...
。例如:
# GET API Endpoint 1
@router.get("/project/details/{project_id}")
# ...
# GET API Endpoint 2
@router.get("/project/metadata/{project_id}")
# ...
# GET API Endpoint 3
@router.get("/project/{project_id}/{employee_id}")
# ...
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD