Construire un framework au-dessus de FastAPI, Alembic & SQLAlchemy

Manu The Blacker 🐊
4 min readApr 19, 2024
Photo by Dstudio Bcn on Unsplash

Cette idĂ©e est nĂ©e aprĂšs avoir recherchĂ© un moyen de crĂ©er le backend pour un projet personnel. FastAPI a Ă©tĂ© choisi, due au fait qu’il permettait de construire une API prĂȘte Ă  l’usage en peu de ligne de codes. Il offrait aussi, le typage des rĂ©ponses et des paramĂštres pour les routes sans nĂ©cessitĂ© d’installer des packages additionnels.

Auparavant, j'utilisais Django qui est trĂšs bien pour construire des applications, des API et bien d’autres usages. Cependant, il arrive que l’ORM n’optimise pas toutes les requĂȘtes sur la base de donnĂ©e, ce qui rend les opĂ©rations trĂšs lourdes Ă  exĂ©cuter.

Le choix de FastAPI a été fait aprÚs avoir parcouru plusieurs sous forums Reddit qui discutait sur des alternatives à Django. Ils recommandaient aussi SQLAlchemy comme ORM et son petit frÚre Alembic pour la gestion des migrations.

NĂ©anmoins, la plupart des tutoriels YouTube qui montraient comment crĂ©er un projet FastAPI ne montraient que comment crĂ©er un projet FastAPI avec qu’un seul fichier python. Ce qui est bien pratique quand on dĂ©bute, mais lorsqu’on pense Ă  dĂ©ployer en production, cette architecture n’est pas pratique.

Alors aprÚs avoir suivi une autre vidéo YouTube mentionnant ce problÚme, il avait été recommandé de prendre exemple sur le répertoire dispatch de Netflix qui utilisait une version modifiée de fastapi.

Dans l’optique d’avoir une structure production-ready, je me suis inspirĂ©e de ce dernier pour restructurer d’une meilleure maniĂšre mon projet, et intĂ©grer des mĂ©canismes proches de ce que Django que proposait par dĂ©faut ( un mĂ©canisme de boilerplate pour crĂ©er une application dans mon projet, un mĂ©canisme pour crĂ©er et migrer mes modĂšles de base de donnĂ©es ).

L’architecture du projet est prĂ©sentĂ©e ci-dessous :

architecture du projet
  -- albic : Configuration folder of Alembic for SQLAlchemy ( env.py and migrations ),
-- apps : Core Folder of the app
-- app_names.py : provide custom app folder to use for db migration.
-- db.py : configure the sqlalchemy interface for the app,
-- env.py : configure the .env to load for the app,
-- init.py : override the venv source folder to force it to run from src folder,
-- run.py : load routers and create the app instance for fastapi
-- command : Utilities to create quickly a fast api app
-- create_app.py : similar to django startapp, he copies template from conf/app_template and
create app with the name given
-- abs_create_app.py : functions needed by create_app.py
-- conf : template used by the command
-- requirements : requirements to run this project
-- templates : used by jinja to serve pages
-- tests : write tests here
alembic.ini : alembic config file to start the project
manage.py : entrypoint to start the project, migrate the database, create a app into the project.peacher : Fast API app
-- albic : Configuration folder of Alembic for SQLAlchemy ( env.py and migrations ),
-- apps : Core Folder of the app
-- app_names.py : provide custom app folder to use for db migration.
-- db.py : configure the sqlalchemy interface for the app,
-- env.py : configure the .env to load for the app,
-- init.py : override the venv source folder,
-- run.py : load routers and create the app instance for fastapi
-- command : Utilities to create quickly a fast api app
-- create_app.py : similar to django startapp, he copies template from conf/app_template and
create app with the name given
-- abs_create_app.py : functions needed by create_app.py
-- conf : template used by the command
-- requirements : requirements to run this project
-- templates : used by jinja to serve pages
-- tests : write tests here
alembic.ini : alembic config file to start the project
manage.py : entrypoint to start the project, migrate the database, create a app into the project

Lien vers le projet :

Le script de démarrage est le fichier manage.py, il est trÚs similaire à celui de Django et propose actuellement 3 commandes :

  • start_server : il dĂ©marre le serveur pour accĂ©der a l’application en production et en dĂ©veloppement. Je l’ai testĂ© actuellement sur render.com. Pour pouvoir le faire tourner sur les autres fournisseurs, cela va nĂ©cessiter des configurations additionnelles
  • migrate_db : il lance le mĂ©canisme de migration de la base de donnĂ©e et versionne-les diffĂ©rents changements,
  • create_app : vous permet de crĂ©er une petite application avec un nom qui vous auriez fourni. Si par exemple votre application se nomme utilisateurs, la structure de votre projet sera la suivante :
structure for app

Je vous remercie d’avoir lu cet article et aimerais que vous le partagiez Ă  vos collĂšgues ou votre Ă©quipe technique que cela intĂ©resserait.

Ne manquez pas d’applaudir et de suivre l’auteur ïžđŸ‘ïžïž

Suivez-moi sur les réseaux sociaux : X | LinkedIn | GitHub

Visiter les projets perso que je conçois : Homescript | Tiyalo | Houegbe | Shokays

--

--

Manu The Blacker 🐊

A passionate self-taught ïŁż Web developer | Write to record my learning and share the knowledge. Learning basics for digital product creation.