Comment définir plusieurs points de terminaison d'API avec le même paramètre de chemin dans FastAPI ?

Patricia Arquette
Libérer: 2024-10-30 17:08:02
original
408 Les gens l'ont consulté

How to Define Multiple API Endpoints with the Same Path Parameter in FastAPI?

Définition de plusieurs points de terminaison d'API avec le même paramètre de chemin dans FastAPI

Dans FastAPI, définition de plusieurs points de terminaison d'API avec le même paramètre de chemin mais différent les chemins ne sont pas simples. Comme l'ordre d'évaluation des points de terminaison est important, le point de terminaison défini en premier sera toujours déclenché, quel que soit le chemin spécifique de la requête.

Problem

Considérez le fichier de routeur suivant où trois points de terminaison sont définis, chacun avec un chemin différent mais partageant le paramètre de chemin "project_id" :

</p>
<h1>GET API Endpoint 1</h1>
<p>@router.get("/project/{project_id}/{employee_id}")<br>async def method_one(project_id : str, organisation_id : str, session : AsyncSession = Depends(get_db)) :</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"># ...
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

GET API Endpoint 2

@router.get("/project/details/{project_id}")
async def method_two(project_id: str, session: AsyncSession = Depends(get_db )):

# ...
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

GET API Endpoint 3

@router.get("/project/metadata/{project_id}")
async def method_two(project_id : str, session : AsyncSession = Depends(get_db)) :

# ...
Copier après la connexion
Copier après la connexion

Ce code présente un comportement inattendu lorsque les points de terminaison de l'API 2 et 3 appellent la méthode du contrôleur définie dans le point de terminaison 1 (method_one ()).

Reason

Dans FastAPI, l'évaluation des points de terminaison se produit de manière séquentielle. Par conséquent, le point de terminaison 1 ("/project/{project_id}/{employee_id}") est évalué en premier. Lorsqu'une requête ultérieure est adressée au point de terminaison 2 ou au point de terminaison 3, FastAPI interprète la partie "/project/{project_id}" du chemin comme paramètre project_id pour le point de terminaison 1. Cela entraîne l'appel de la méthode du contrôleur pour le point de terminaison 1.

Solution

Pour résoudre ce problème, l'ordre de définition du point de terminaison doit être inversé afin que les points de terminaison avec le même paramètre de chemin soient définis avant le point de terminaison qui inclut un chemin supplémentaire paramètres :

</p>
<h1>GET API Endpoint 2</h1>
<p>@router.get("/project/details/{project_id} ")</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"># ...
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

GET API Endpoint 3

@router.get("/project/metadata/{project_id}")

# ...
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

GET API Endpoint 1

@router.get("/project/{project_id}/{employee_id}")

# ...
Copier après la connexion
Copier après la connexion

En effectuant cette modification, FastAPI évaluera d'abord les points de terminaison 2 et 3, en s'assurant que les méthodes de contrôleur appropriées sont exécutées lorsque des demandes sont adressées à ces points de terminaison.

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!

source:php.cn
Article précédent:Pourquoi `list.__iadd__` modifie-t-il à la fois les listes originales et assignées, alors que `list.__add__` ne modifie que la liste assignée ? Article suivant:Comment puis-je analyser efficacement les lignes de fichiers de largeur fixe en Python ?
Déclaration de ce site Web
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
Derniers articles par auteur
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!