Bienvenue à tous et à toutes pour ce combat en 5 rounds pour la ceinture mondiale du "Meilleur Microframework Python" !
Dans le coin bleu, laissez-moi vous introduire le champion en titre... Flask ! Avec une première version mise en ligne en 2010, Flask est rapidement devenu incontournable pour la réalisation d'API HTTP avec Python.
Dans le coin rouge, laissez-moi vous introduire le challengeur... FastAPI ! Premier commit effectué en 2018, FastAPI était à l'origine destiné aux Data Scientists pour leur permettre de produire des API HTTP très simplement. Quelques années plus tard, il s'attaque à des terrains beaucoup plus variés.
Mais ira-t-il jusqu'à mettre le grand champion KO ?
C'EST L'HEURE DU DUDUDUDUDUEL !
Yu-gi-ho

Round 1 : l'atout de la jeunesse

Une première différence entre ces deux microframeworks saute aux yeux : l'ancienneté. FastAPI a été conçu sur des versions de Python bien plus récentes et dans un univers plus mature sur la production que son adversaire du jour.
L'atout de la jeunesse... Ok, mais qu'est-ce-que cela implique ?
FastAPI est né à l'époque actuelle où la plupart des applications web sont constituées d'un backend et d'un frontend séparés. Ainsi, il a été conçu dans l'idée de permettre la création d'APIs renvoyant des JSON out-of-the-box, à l'inverse de Flask qui ne fait pas d'a priori sur ce point.
#Avec FastAPI
@app.get("/")
def health_check():
    return {"status": "ok"}

#Avec Flask
@app.get("/")
def health_check():
    return jsonify({"status": "ok"})
À l'inverse, là où Flask vient avec un système de templating embarqué, l'implémentation du templating en FastAPI nécéssite une configuration.
#Avec FastAPI
from fastapi.templates import Jinja2Templates

templates = Jinja2Templates(directory="templates")

@app.get("/index", response_class=HTMLResponse)
def index():
    return templates.TemplateResponse("index.html")


#Avec Flask
from flask import render_template

@app.get("/index")
def index():
    return render_template("index.html")
Ok récapitulons...
Le round 1 va à FastAPI avec son crochet du JSON mais Flask s'est immédiatement ressaisi en rentrant directement dans le deuxième round avec un uppercut du templating tout simplement sublime ! Un très beau combat pour l'instant, continuons...

Round 2 et +

La construction de FastAPI sur des versions récentes de Python implique notamment le support natif des serveurs asynchrones de type ASGI comme Uvicorn à la différence de Flask qui ne le supporte pas.
Autre point très intéressant qui découle de cette même raison, FastAPI supporte nativement pydantic et donc le typage et les Data Classes pour les versions plus récentes de Python. Le typage supprime notamment la nécessité de créer des modules pour valider le format des données reçues, comme c'en était l'usage en Flask. Plutôt pratique... et un round pour FastAPI !
Ayant été conçu dans un univers plus mature, les patterns comme l'injection de dépendances ou l'implémentation de l'authentification OAuth sont intégrés à la base de FastAPI, ce qui n'est pas le cas sur Flask.
En somme, la où une application Flask complète et en production va certainement nécessiter l'import de nombreux packages "modernes", FastAPI propose ces modules en-dehors-de-la-boîte.

Finish him

Pour conclure et n'en déplaise à nos amis développeurs frontend qui me lisent, je vais me risquer à une comparaison avec les frameworks / bibliothèques JavaScript :
  • Flask se rapproche plus d'un React qui est très léger et autour duquel gravitent une infinité de packages (rien que pour le state-management : Redux, Mobx, XState, easy-peasy...).
  • Quant à FastAPI, il est plus semblable à Vue.js qui possède une grande quantité de packages disponibles, installables et configurables comme vue-router et vuex pour ne citer qu'eux.
"Bon t'es bien mignon Oualid avec tes 472 lignes de description sur les deux microframeworks Python, mais nous on veut savoir qui se prend un bon gros KO !"

And the winner is...

Au risque de vous décevoir, pas de KO dans ce duel au sommet. On part plutôt sur une décision des juges à l'issue des 12 rounds.
En réalité, il serait ridicule de dire que FastAPI est meilleur que Flask ou inversement : ces deux frameworks ont des philosophies différentes. En tant que développeur, on peut naturellement adhérer à l'une des philosophies plutôt qu'à l'autre, mais le choix doit être fait selon la nature du projet.
Il me semble d'ailleurs intéressant d'ouvrir une parenthèse en rappelant le triptyque classique de l'ingénierie logicielle pour un projet viable : Sécurité, Stabilité, Coût.
Sweet spot
Aujourd'hui, je pense que l'on peut dire que FastAPI comme Flask sont des projets matures et stables. Une piste à explorer lors du choix entre ces deux frameworks est celle de la maintenabilité de l'application sur le long-terme.
En effet, Flask est composé de sous-packages : si l'un de ces packages vient à ne plus être maintenu, il suffit de le remplacer et d'adapter le code concerné.
FastAPI inclut de nombreux modules nativement : si le framework lui-même n'est plus maintenue - ce qui, soit dit en passant, a peu de chance d'arriver à court ou moyen-terme - il faudra remplacer toute l'interface API.
Fin du match.
Les juges ont délibéré.
Le résultat final après la pub.
Cordialement,
fin