Skip to content

FastAPI

FastAPI

Framework FastAPI, haute performance, facile Ă  apprendre, rapide Ă  coder, prĂȘt pour la production

Test Coverage Package version Supported Python versions


Documentation : https://fastapi.tiangolo.com

Code Source : https://github.com/tiangolo/fastapi


FastAPI est un framework web moderne et rapide (haute performance) pour la création d'API avec Python 3.8+, basé sur les annotations de type standard de Python.

Les principales fonctionnalités sont :

  • RapiditĂ© : De trĂšs hautes performances, au niveau de NodeJS et Go (grĂące Ă  Starlette et Pydantic). L'un des frameworks Python les plus rapides.
  • Rapide Ă  coder : Augmente la vitesse de dĂ©veloppement des fonctionnalitĂ©s d'environ 200 % Ă  300 %. *
  • Moins de bugs : RĂ©duit d'environ 40 % les erreurs induites par le dĂ©veloppeur. *
  • Intuitif : Excellente compatibilitĂ© avec les IDE. ComplĂ©tion complĂšte. Moins de temps passĂ© Ă  dĂ©boguer.
  • Facile : Conçu pour ĂȘtre facile Ă  utiliser et Ă  apprendre. Moins de temps passĂ© Ă  lire la documentation.
  • Concis : Diminue la duplication de code. De nombreuses fonctionnalitĂ©s liĂ©es Ă  la dĂ©claration de chaque paramĂštre. Moins de bugs.
  • Robuste : Obtenez un code prĂȘt pour la production. Avec une documentation interactive automatique.
  • BasĂ© sur des normes : BasĂ© sur (et entiĂšrement compatible avec) les standards ouverts pour les APIs : OpenAPI (prĂ©cĂ©demment connu sous le nom de Swagger) et JSON Schema.

* estimation basée sur des tests d'une équipe de développement interne, construisant des applications de production.

Sponsors

Other sponsors

Opinions

"[...] J'utilise beaucoup FastAPI ces derniers temps. [...] Je prévois de l'utiliser dans mon équipe pour tous les services de ML chez Microsoft. Certains d'entre eux seront intégrés dans le coeur de Windows et dans certains produits Office."

Kabir Khan - Microsoft (ref)

"Nous avons adoptĂ© la bibliothĂšque FastAPI pour crĂ©er un serveur REST qui peut ĂȘtre interrogĂ© pour obtenir des prĂ©dictions. [pour Ludwig]"

Piero Molino, Yaroslav Dudin et Sai Sumanth Miryala - Uber (ref)

"Netflix a le plaisir d'annoncer la sortie en open-source de notre framework d'orchestration de gestion de crise : Dispatch ! [construit avec FastAPI]"

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)

"Je suis trĂšs enthousiaste Ă  propos de FastAPI. C'est un bonheur !"

Brian Okken - Auteur du podcast Python Bytes (ref)

"HonnĂȘtement, ce que vous avez construit a l'air super solide et Ă©lĂ©gant. A bien des Ă©gards, c'est comme ça que je voulais que Hug soit - c'est vraiment inspirant de voir quelqu'un construire ça."

Timothy Crosley - Créateur de Hug (ref)

"Si vous cherchez à apprendre un framework moderne pour créer des APIs REST, regardez FastAPI [...] C'est rapide, facile à utiliser et à apprendre [...]"

"Nous sommes passés à FastAPI pour nos APIs [...] Je pense que vous l'aimerez [...]"

Ines Montani - Matthew Honnibal - Fondateurs de Explosion AI - Créateurs de spaCy (ref) - (ref)

"Si quelqu'un cherche à construire une API Python de production, je recommande vivement FastAPI. Il est bien conçu, simple à utiliser et trÚs évolutif. Il est devenu un composant clé dans notre stratégie de développement API first et il est à l'origine de nombreux automatismes et services tels que notre ingénieur virtuel TAC."

Deon Pillsbury - Cisco (ref)

Typer, le FastAPI des CLI

Si vous souhaitez construire une application CLI utilisable dans un terminal au lieu d'une API web, regardez Typer.

Typer est le petit frĂšre de FastAPI. Et il est destinĂ© Ă  ĂȘtre le FastAPI des CLI. ⌚ 🚀

Prérequis

Python 3.8+

FastAPI repose sur les épaules de géants :

Installation

$ pip install fastapi

---> 100%

Vous aurez Ă©galement besoin d'un serveur ASGI pour la production tel que Uvicorn ou Hypercorn.

$ pip install "uvicorn[standard]"

---> 100%

Exemple

Créez

  • CrĂ©ez un fichier main.py avec :
from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}
Ou utilisez async def ...

Si votre code utilise async / await, utilisez async def :

from typing import Union

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

Note

Si vous n'ĂȘtes pas familier avec cette notion, consultez la section "Vous ĂȘtes pressĂ©s ?" Ă  propos de async et await dans la documentation.

Lancez

Lancez le serveur avec :

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
À propos de la commande uvicorn main:app --reload ...

La commande uvicorn main:app fait référence à :

  • main : le fichier main.py (le "module" Python).
  • app : l'objet crĂ©Ă© Ă  l'intĂ©rieur de main.py avec la ligne app = FastAPI().
  • --reload : fait redĂ©marrer le serveur aprĂšs des changements de code. À n'utiliser que pour le dĂ©veloppement.

VĂ©rifiez

Ouvrez votre navigateur Ă  l'adresse http://127.0.0.1:8000/items/5?q=somequery.

Vous obtenez alors cette réponse JSON :

{"item_id": 5, "q": "somequery"}

Vous venez de créer une API qui :

  • Reçoit les requĂȘtes HTTP pour les chemins / et /items/{item_id}.
  • Les deux chemins acceptent des opĂ©rations GET (Ă©galement connu sous le nom de mĂ©thodes HTTP).
  • Le chemin /items/{item_id} a un paramĂštre item_id qui doit ĂȘtre un int.
  • Le chemin /items/{item_id} a un paramĂštre de requĂȘte optionnel q de type str.

Documentation API interactive

Maintenant, rendez-vous sur http://127.0.0.1:8000/docs.

Vous verrez la documentation interactive automatique de l'API (fournie par Swagger UI) :

Swagger UI

Documentation API alternative

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

Vous verrez la documentation interactive automatique de l'API (fournie par ReDoc) :

ReDoc

Exemple plus poussé

Maintenant, modifiez le fichier main.py pour recevoir le corps d'une requĂȘte PUT.

DĂ©clarez ce corps en utilisant les types Python standards, grĂące Ă  Pydantic.

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

Le serveur se recharge normalement automatiquement (car vous avez pensé à --reload dans la commande uvicorn ci-dessus).

Plus loin avec la documentation API interactive

Maintenant, rendez-vous sur http://127.0.0.1:8000/docs.

  • La documentation interactive de l'API sera automatiquement mise Ă  jour, y compris le nouveau corps de la requĂȘte :

Swagger UI

  • Cliquez sur le bouton "Try it out", il vous permet de renseigner les paramĂštres et d'interagir directement avec l'API :

Swagger UI interaction

  • Cliquez ensuite sur le bouton "Execute", l'interface utilisateur communiquera avec votre API, enverra les paramĂštres, obtiendra les rĂ©sultats et les affichera Ă  l'Ă©cran :

Swagger UI interaction

Plus loin avec la documentation API alternative

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

  • La documentation alternative reflĂ©tera Ă©galement le nouveau paramĂštre de requĂȘte et le nouveau corps :

ReDoc

En résumé

En rĂ©sumĂ©, vous dĂ©clarez une fois les types de paramĂštres, le corps de la requĂȘte, etc. en tant que paramĂštres de fonction.

Vous faites cela avec les types Python standard modernes.

Vous n'avez pas à apprendre une nouvelle syntaxe, les méthodes ou les classes d'une bibliothÚque spécifique, etc.

Juste du Python 3.8+ standard.

Par exemple, pour un int:

item_id: int

ou pour un modĂšle Item plus complexe :

item: Item

... et avec cette déclaration unique, vous obtenez :

  • Une assistance dans votre IDE, notamment :
    • la complĂ©tion.
    • la vĂ©rification des types.
  • La validation des donnĂ©es :
    • des erreurs automatiques et claires lorsque les donnĂ©es ne sont pas valides.
    • une validation mĂȘme pour les objets JSON profondĂ©ment imbriquĂ©s.
  • Une conversion des donnĂ©es d'entrĂ©e : venant du rĂ©seau et allant vers les donnĂ©es et types de Python, permettant de lire :
    • le JSON.
    • les paramĂštres du chemin.
    • les paramĂštres de la requĂȘte.
    • les cookies.
    • les en-tĂȘtes.
    • les formulaires.
    • les fichiers.
  • La conversion des donnĂ©es de sortie : conversion des donnĂ©es et types Python en donnĂ©es rĂ©seau (au format JSON), permettant de convertir :
    • les types Python (str, int, float, bool, list, etc).
    • les objets datetime.
    • les objets UUID.
    • les modĂšles de base de donnĂ©es.
    • ... et beaucoup plus.
  • La documentation API interactive automatique, avec 2 interfaces utilisateur au choix :
    • Swagger UI.
    • ReDoc.

Pour revenir à l'exemple de code précédent, FastAPI permet de :

  • Valider que item_id existe dans le chemin des requĂȘtes GET et PUT.
  • Valider que item_id est de type int pour les requĂȘtes GET et PUT.
    • Si ce n'est pas le cas, le client voit une erreur utile et claire.
  • VĂ©rifier qu'il existe un paramĂštre de requĂȘte facultatif nommĂ© q (comme dans http://127.0.0.1:8000/items/foo?q=somequery) pour les requĂȘtes GET.
    • Puisque le paramĂštre q est dĂ©clarĂ© avec = None, il est facultatif.
    • Sans le None, il serait nĂ©cessaire (comme l'est le corps de la requĂȘte dans le cas du PUT).
  • Pour les requĂȘtes PUT vers /items/{item_id}, de lire le corps en JSON :
    • VĂ©rifier qu'il a un attribut obligatoire name qui devrait ĂȘtre un str.
    • VĂ©rifier qu'il a un attribut obligatoire prix qui doit ĂȘtre un float.
    • VĂ©rifier qu'il a un attribut facultatif is_offer, qui devrait ĂȘtre un bool, s'il est prĂ©sent.
    • Tout cela fonctionnerait Ă©galement pour les objets JSON profondĂ©ment imbriquĂ©s.
  • Convertir de et vers JSON automatiquement.
  • Documenter tout avec OpenAPI, qui peut ĂȘtre utilisĂ© par :
    • Les systĂšmes de documentation interactifs.
    • Les systĂšmes de gĂ©nĂ©ration automatique de code client, pour de nombreuses langues.
  • Fournir directement 2 interfaces web de documentation interactive.

Nous n'avons fait qu'effleurer la surface, mais vous avez déjà une idée de la façon dont tout cela fonctionne.

Essayez de changer la ligne contenant :

    return {"item_name": item.name, "item_id": item_id}

... de :

        ... "item_name": item.name ...

... vers :

        ... "item_price": item.price ...

... et voyez comment votre éditeur complétera automatiquement les attributs et connaßtra leurs types :

compatibilité IDE

Pour un exemple plus complet comprenant plus de fonctionnalités, voir le Tutoriel - Guide utilisateur.

Spoiler alert : le tutoriel - guide utilisateur inclut :

  • DĂ©claration de paramĂštres provenant d'autres endroits diffĂ©rents comme : en-tĂȘtes., cookies, champs de formulaire et fichiers.
  • L'utilisation de contraintes de validation comme maximum_length ou regex.
  • Un systĂšme d'injection de dĂ©pendance trĂšs puissant et facile Ă  utiliser .
  • SĂ©curitĂ© et authentification, y compris la prise en charge de OAuth2 avec les jetons JWT et l'authentification HTTP Basic.
  • Des techniques plus avancĂ©es (mais tout aussi faciles) pour dĂ©clarer les modĂšles JSON profondĂ©ment imbriquĂ©s (grĂące Ă  Pydantic).
  • IntĂ©gration de GraphQL avec Strawberry et d'autres bibliothĂšques.
  • D'obtenir de nombreuses fonctionnalitĂ©s supplĂ©mentaires (grĂące Ă  Starlette) comme :
    • WebSockets
    • de tester le code trĂšs facilement avec requests et pytest
    • CORS
    • Cookie Sessions
    • ... et plus encore.

Performance

Les benchmarks TechEmpower indépendants montrent que les applications FastAPI s'exécutant sous Uvicorn sont parmi les frameworks existants en Python les plus rapides , juste derriÚre Starlette et Uvicorn (utilisés en interne par FastAPI). (*)

Pour en savoir plus, consultez la section Benchmarks.

DĂ©pendances facultatives

Utilisées par Pydantic:

Utilisées par Starlette :

  • requests - Obligatoire si vous souhaitez utiliser TestClient.
  • jinja2 - Obligatoire si vous souhaitez utiliser la configuration de template par dĂ©faut.
  • python-multipart - Obligatoire si vous souhaitez supporter le "dĂ©codage" de formulaire avec request.form().
  • itsdangerous - Obligatoire pour la prise en charge de SessionMiddleware.
  • pyyaml - Obligatoire pour le support SchemaGenerator de Starlette (vous n'en avez probablement pas besoin avec FastAPI).
  • ujson - Obligatoire si vous souhaitez utiliser UJSONResponse.

Utilisées par FastAPI / Starlette :

  • uvicorn - Pour le serveur qui charge et sert votre application.
  • orjson - Obligatoire si vous voulez utiliser ORJSONResponse.

Vous pouvez tout installer avec pip install fastapi[all].

Licence

Ce projet est soumis aux termes de la licence MIT.