Maison >développement back-end >Tutoriel Python >Pourquoi mon point de terminaison FastAPI `method_one` est-il toujours exécuté, quel que soit le chemin ?

Pourquoi mon point de terminaison FastAPI `method_one` est-il toujours exécuté, quel que soit le chemin ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 11:24:02207parcourir

Why is my FastAPI Endpoint `method_one` Always Being Executed, Regardless of Path?

Plusieurs points de terminaison d'API avec des paramètres de chemin dans FastAPI

La définition de plusieurs points de terminaison d'API dans FastAPI avec des variations dans la structure des chemins tout en partageant les paramètres de chemin peut conduire à comportement inattendu. Dans l'exemple de code fourni, vous rencontrez un problème où le contrôleur « method_one » est exécuté pour tous les points de terminaison de l'API, quels que soient leurs chemins spécifiés.

Comprendre la correspondance de chemin

Dans FastAPI, l'ordre des définitions des points de terminaison est crucial. La correspondance de chemin est évaluée à partir du premier point de terminaison déclaré dans votre application. Par conséquent, votre point de terminaison pour "/project/{project_id}/{employee_id}" est évalué en premier, et tous les autres paramètres de chemin de point de terminaison sont interprétés comme faisant partie du paramètre project_id.

Solution

Pour résoudre ce problème, vous devez vous assurer que les points de terminaison avec des chemins plus spécifiques sont définis avant les points de terminaison avec des chemins plus génériques. Cela garantit que FastAPI évalue d'abord le point de terminaison le plus spécifique et que les paramètres de chemin correspondent comme prévu.

L'exemple de code corrigé ressemblerait à ceci :

<code class="python"># GET API Endpoint 2
@router.get("/project/details/{project_id}")
async def method_two(
    project_id: str, session: AsyncSession = Depends(get_db)
):
    # ...

# GET API Endpoint 3
@router.get("/project/metadata/{project_id}")
async def method_three(
    project_id: str, session: AsyncSession = Depends(get_db)
):
    # ...

# GET API Endpoint 1
@router.get("/project/{project_id}/{employee_id}")
async def method_one(
    project_id: str, employee_id: str, session: AsyncSession = Depends(get_db)
):
    # ...</code>

Avec cet ajustement, le plus spécifique les points de terminaison (/project/details/{project_id} et /project/metadata/{project_id}) seront évalués avant le point de terminaison plus générique (/project/{project_id}/{employee_id}), garantissant que les méthodes de contrôleur correctes sont exécutées pour chaque point de terminaison de l'API.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn