DĂ©marrage¶
Le fichier FastAPI le plus simple possible pourrait ressembler Ă cela :
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Copiez ce code dans un fichier nommé main.py
.
DĂ©marrez le serveur :
$ uvicorn main:app --reload
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
<span style="color: green;">INFO</span>: Started reloader process [28720]
<span style="color: green;">INFO</span>: Started server process [28722]
<span style="color: green;">INFO</span>: Waiting for application startup.
<span style="color: green;">INFO</span>: Application startup complete.
Note
La commande uvicorn main:app
fait référence à :
main
: le fichiermain.py
(le module Python).app
: l'objet créé dansmain.py
via la ligneapp = FastAPI()
.--reload
: l'option disant à uvicorn de redémarrer le serveur à chaque changement du code. à ne pas utiliser en production !
Vous devriez voir dans la console, une ligne semblable Ă la suivante :
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Cette ligne montre l'URL par laquelle l'app est actuellement accessible, sur votre machine locale.
Allez voir le rĂ©sultat¶
Ouvrez votre navigateur Ă l'adresse http://127.0.0.1:8000.
Vous obtiendrez cette réponse JSON :
{"message": "Hello World"}
Documentation interactive de l'API¶
Rendez-vous sur http://127.0.0.1:8000/docs.
Vous verrez la documentation interactive de l'API générée automatiquement (via Swagger UI) :
Documentation alternative¶
Ensuite, rendez-vous sur http://127.0.0.1:8000/redoc.
Vous y verrez la documentation alternative (via ReDoc) :
OpenAPI¶
FastAPI génÚre un "schéma" contenant toute votre API dans le standard de définition d'API OpenAPI.
"SchĂ©ma"¶
Un "schéma" est une définition ou une description de quelque chose. Pas le code qui l'implémente, uniquement une description abstraite.
"SchĂ©ma" d'API¶
Ici, OpenAPI est une spécification qui dicte comment définir le schéma de votre API.
Le schéma inclut les chemins de votre API, les paramÚtres potentiels de chaque chemin, etc.
"SchĂ©ma" de donnĂ©es¶
Le terme "schéma" peut aussi faire référence à la forme de la donnée, comme un contenu JSON.
Dans ce cas, cela signifierait les attributs JSON, ainsi que les types de ces attributs, etc.
OpenAPI et JSON Schema¶
OpenAPI définit un schéma d'API pour votre API. Il inclut des définitions (ou "schémas") de la donnée envoyée et reçue par votre API en utilisant JSON Schema, le standard des schémas de données JSON.
Allez voir openapi.json
¶
Si vous ĂȘtes curieux d'Ă quoi ressemble le schĂ©ma brut OpenAPI, FastAPI gĂ©nĂšre automatiquement un (schĂ©ma) JSON avec les descriptions de toute votre API.
Vous pouvez le voir directement Ă cette adresse : http://127.0.0.1:8000/openapi.json.
Le schéma devrait ressembler à ceci :
{
"openapi": "3.0.2",
"info": {
"title": "FastAPI",
"version": "0.1.0"
},
"paths": {
"/items/": {
"get": {
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
...
Ă quoi sert OpenAPI¶
Le schéma OpenAPI est ce qui alimente les deux systÚmes de documentation interactive.
Et il existe des dizaines d'alternatives, toutes basées sur OpenAPI. Vous pourriez facilement ajouter n'importe laquelle de ces alternatives à votre application FastAPI.
Vous pourriez aussi l'utiliser pour générer du code automatiquement, pour les clients qui communiquent avec votre API. Comme par exemple, des applications frontend, mobiles ou IOT.
RĂ©capitulatif, Ă©tape par Ă©tape¶
Ătape 1 : import FastAPI
¶
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
FastAPI
est une classe Python qui fournit toutes les fonctionnalités nécessaires au lancement de votre API.
DĂ©tails techniques
FastAPI
est une classe héritant directement de Starlette
.
Vous pouvez donc aussi utiliser toutes les fonctionnalités de Starlette depuis FastAPI
.
Ătape 2 : crĂ©er une "instance" FastAPI
¶
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Ici la variable app
sera une "instance" de la classe FastAPI
.
Ce sera le point principal d'interaction pour créer toute votre API.
Cette app
est la mĂȘme que celle Ă laquelle fait rĂ©fĂ©rence uvicorn
dans la commande :
$ uvicorn main:app --reload
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Si vous créez votre app avec :
from fastapi import FastAPI
my_awesome_api = FastAPI()
@my_awesome_api.get("/")
async def root():
return {"message": "Hello World"}
Et la mettez dans un fichier main.py
, alors vous appelleriez uvicorn
avec :
$ uvicorn main:my_awesome_api --reload
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Ătape 3: crĂ©er une opĂ©ration de chemin¶
Chemin¶
Chemin, ou "path" fait référence ici à la derniÚre partie de l'URL démarrant au premier /
.
Donc, dans un URL tel que :
https://example.com/items/foo
...le "path" serait :
/items/foo
Info
Un chemin, ou "path" est aussi souvent appelé route ou "endpoint".
OpĂ©ration¶
"Opération" fait référence à une des "méthodes" HTTP.
Une de :
POST
GET
PUT
DELETE
...ou une des plus exotiques :
OPTIONS
HEAD
PATCH
TRACE
Dans le protocol HTTP, vous pouvez communiquer avec chaque chemin en utilisant une (ou plus) de ces "méthodes".
En construisant des APIs, vous utilisez généralement ces méthodes HTTP spécifiques pour effectuer une action précise.
Généralement vous utilisez :
POST
: pour créer de la donnée.GET
: pour lire de la donnée.PUT
: pour mettre à jour de la donnée.DELETE
: pour supprimer de la donnée.
Donc, dans OpenAPI, chaque méthode HTTP est appelée une "opération".
Nous allons donc aussi appeler ces derniÚres des "opérations".
DĂ©finir un dĂ©corateur d'opĂ©ration de chemin¶
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Le @app.get("/")
dit Ă FastAPI que la fonction en dessous est chargĂ©e de gĂ©rer les requĂȘtes qui vont sur :
- le chemin
/
- en utilisant une opération
get
@décorateur
Info
Cette syntaxe @something
en Python est appelée un "décorateur".
Vous la mettez au dessus d'une fonction. Comme un joli chapeau dĂ©coratif (j'imagine que ce terme vient de lĂ đ€·đ»ââ).
Un "décorateur" prend la fonction en dessous et en fait quelque chose.
Dans notre cas, ce décorateur dit à FastAPI que la fonction en dessous correspond au chemin /
avec l'opération get
.
C'est le "décorateur d'opération de chemin".
Vous pouvez aussi utiliser les autres opérations :
@app.post()
@app.put()
@app.delete()
Tout comme celles les plus exotiques :
@app.options()
@app.head()
@app.patch()
@app.trace()
Astuce
Vous ĂȘtes libres d'utiliser chaque opĂ©ration (mĂ©thode HTTP) comme vous le dĂ©sirez.
FastAPI n'impose pas de sens spécifique à chacune d'elle.
Les informations qui sont présentées ici forment une directive générale, pas des obligations.
Par exemple, quand l'on utilise GraphQL, toutes les actions sont effectuées en utilisant uniquement des opérations POST
.
Ătape 4 : dĂ©finir la fonction de chemin.¶
Voici notre "fonction de chemin" (ou fonction d'opération de chemin) :
- chemin :
/
. - opération :
get
. - fonction : la fonction sous le "décorateur" (sous
@app.get("/")
).
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
C'est une fonction Python.
Elle sera appelĂ©e par FastAPI quand une requĂȘte sur l'URL /
sera reçue via une opération GET
.
Ici, c'est une fonction asynchrone (définie avec async def
).
Vous pourriez aussi la définir comme une fonction classique plutÎt qu'avec async def
:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
Note
Si vous ne connaissez pas la diffĂ©rence, allez voir la section Concurrence : "Vous ĂȘtes pressĂ©s ?".
Ătape 5 : retourner le contenu¶
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
Vous pouvez retourner un dictionnaire (dict
), une liste (list
), des valeurs seules comme des chaines de caractĂšres (str
) et des entiers (int
), etc.
Vous pouvez aussi retourner des models Pydantic (qui seront détaillés plus tard).
Il y a de nombreux autres objets et modÚles qui seront automatiquement convertis en JSON. Essayez d'utiliser vos favoris, il est fort probable qu'ils soient déjà supportés.
RĂ©capitulatif¶
- Importez
FastAPI
. - Créez une instance d'
app
. - Ajoutez une décorateur d'opération de chemin (tel que
@app.get("/")
). - Ajoutez une fonction de chemin (telle que
def root(): ...
comme ci-dessus). - Lancez le serveur de développement (avec
uvicorn main:app --reload
).