簡體   English   中英

如何在 FastAPI 中定義多個路徑不同但路徑參數相同的 API 端點?

[英]How to define multiple API endpoints in FastAPI with different paths but the same path parameter?

我正在開發一個使用 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 端點中的每一個都被其所需的路徑參數觸發時,將執行 controller 方法,如其主體中所定義。

然而,由於一些奇怪的原因,當 API 端點 2 和 3 被觸發時,它們正在執行端點 1 中的 controller 方法,即CustomController.method_one()

在路由器的方法method_one()中添加一些print()語句后,我觀察到在調用method_one()端點 2 時調用了 method_one(),而它實際上應該在路由器中調用method_two() API 端點 3 的情況也是如此。

當觸發 API 端點 2 和 3 時,我無法理解為什么要執行method_one()的方法體。 我是不是在配置上遺漏了什么,或者什么——有人可以糾正我嗎? 謝謝!

在 FastAPI 中,如這個答案中所述,因為端點是按順序評估的(請參閱 FastAPI 關於順序的重要性),它確保您首先在應用程序中定義的端點 - 在這種情況下,即/project/{project_id}/... — 將首先進行評估。 因此,每次調用其他兩個端點之一(即/project/details/.../project/metadata/... )時,都會觸發第一個端點,使用detailsmetadata作為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}")
    # ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM