Aller au contenu

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 fichier main.py (le module Python).
  • app : l'objet crĂ©Ă© dans main.py via la ligne app = 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) :

Swagger UI

Documentation alternative

Ensuite, rendez-vous sur http://127.0.0.1:8000/redoc.

Vous y verrez la documentation alternative (via ReDoc) :

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).