FastAPI : Le meilleur framework web Python en 2021

Oui ce titre est racoleur, oui il fait preuve d'une opinion totalement biaisée. Mais bordel, quand quelque chose est bien, il faut le dire ! Quitte à utiliser de falacieux moyens dignes du meilleur growth hacker, à savoir, je vous le donne en mille : le titre putaclick.

Passée cette intro de qualité, venons-en aux faits : FastAPI est le meilleur framework Web Python que j'ai pu utiliser depuis de nombreuses années, loin devant Django, DRF, Flask ou autres Pyramid.

Sur les épaules des géants

On pourrait se dire, mais pourquoi encore un framework de plus ? C'est justement ce que j'aime chez FastAPI, ce n'est pas juste un Framework de plus. Sa conception a été réfléchie, documentée, et est construit sur l'existant. Il y a même une page complète qui explique la démarche et ce qui a été pris des différents frameworks existants et pourquoi.

FastAPI wouldn't exist if not for the previous work of others.

There have been many tools created before that have helped inspire its creation.

I have been avoiding the creation of a new framework for several years. First I tried to solve all the features covered by FastAPI using many different frameworks, plug-ins, and tools.

But at some point, there was no other option than creating something that provided all these features, taking the best ideas from previous tools, and combining them in the best way possible, using language features that weren't even available before (Python 3.6+ type hints).

Et pour chaque framework/outil il y a une explication de ce qui a été gardé pour FastAPI.

Inspiration FastAPI DRF

C'est pour moi un point très important : c'est un Framework qui a été pensé, réfléchi et qui est construit sur ce qui existe déjà.

À la pointe des évolutions de Python

Qu'on aime ou pas Python a, ces dernières années, intégré deux évolutions majeures :

Pour faire simple, la programmation asynchrone va permettre à des programmes Python de faire plus de choses en même temps, sans être obligé d'attendre que certaines tâches soient finies pour passer à d'autres. Vous l'avez naturellement dans Node.JS, Go, Rust (plus récemment) et donc maintenant Python. Pour plus d'explications, n'hésitez pas à aller lire cet article sur Zeste de savoir.

Les typehints quant à eux, vont aider le compilateur et donc vous, par la même occasion, à savoir ce que vous voulez faire de votre programme. Ci-dessous par exemple, on spécifie que la fonction greeting doit prendre une chaîne de caractères (str) en paramètre. Si vous lui donnez ce qu'il sait être un int, le compilateur vous en informera.

def greeting(name: str) -> str:
    return 'Hello ' + name

PHP a fait cette mutation il y a quelques années, javascript/typescript aussi, et c'est donc maintenant aussi le cas de Python depuis la version 3.6. On pourrait débattre des heures sur le typage des langages de programmation dynamiques, mais ce n'est pas le sujet ici.

Le sujet est que FastAPI l'utilise partout, l'encourage dans sa documentation et par l'utilisation de Pydantic pour valider vos données.

Cela va permettre :

Typehints python complétion

Typehints python exemple 2

Documentation officielle python Cheat sheet mypy

Orienté API, mais pas que

De plus en plus, dès que vous avez une application web (avec un framework javascript en front) ou mobile à faire, tout ce dont vous avez besoin, c'est une API Json. FastAPI est parfait pour ça. Vraiment. Beaucoup plus simple que DRF, pas besoin d'apprendre je ne sais quelle syntaxe pour transformer vos objets en JSON, tout est simple et utilisable tel quel (notamment grâce à Pydantic et les typehints).

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


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


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


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = 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}

Et avec ça vous avez en plus une documentation auto-générée.

FastAPI swagger

Je ne vais pas rentrer dans les détails, vous pourrez les trouver sur le site web de FastAPI. Mais vraiment, si vous avez une API Json à faire, ne cherchez pas plus loin.

Et si je dois faire un site internet « classique » ? Et bien ça se fait très bien aussi. J'ai personnellement réalisé un site avec :

Simple, efficace et plein de fonctionnalités

FastAPI combine pour moi le meilleur de tous les mondes :

Voici une liste à la Prévert de ses fonctionnalités issues du site web de FastAPI:

FastAPI étant basé sur Starlette, il dispose aussi de toutes ses fonctionnalités :

Conclusion

Clairement, pour moi, si je devais commencer un projet web de type API en python, choisir FastAPI me paraitrait être une évidence. Il est moderne, rapide et développé par quelqu'un qui réfléchit avant de coder.

Si je devais commencer un projet web plus classique avec besoin de templating, de formulaires, etc. je partirais aussi sur FastAPI. Il permet tout ça très bien avec une touche de modernité et de simplicité qui est la bienvenue.

Si en revanche vous avez absolument besoin de l'admin Django, partir avec FastAPI n'est pas forcément une bonne idée. Même s'il existe une libraire d'administration FastAPI elle est assez récente et n'a rien à voir avec celle de Django. Dans ce cas là ça vaut quand même le coup de se poser la question : est-ce que vous avez vraiment besoin de l'admin ? Il est des fois plus rapide de re-développer soi-même que de passer du temps à configurer un truc déjà tout prêt.

Quoiqu'il en soit, FastAPI est le framework Python qui m'a le plus impressionné depuis des années. Pour moi, l'essayer, c'est l'adopter ! Pour commencer, vous pouvez suivre le tutorial du site web officiel.

Vous pouvez aussi consulter le guide complet que je suis en train d'écrire à ce sujet :

Stay tuned pour la suite ! :tada: