J’entends souvent dire que les gens passionnés de technologie sont éloignés de la nature humaine, qu’ils et elles sont perdus dans les nuages. Aujourd’hui, on va aller plus loin que les nuages, dans les étoiles !
Le code peut aussi servir à explorer des domaines plus… ésotériques, tout en restant ancré dans la rigueur technique. Aujourd’hui, je présente comment j’ai conçu une application web pour générer des cartes du ciel astrologiques personnalisées pour une cliente. Ce projet m’a permis de ressortir des outils de dessin scientifique pour un usage complètement différent des tableaux de bord statistiques.
Comment prendre des concepts millénaires et les traduire en algorithmes précis, tout en offrant une expérience utilisateur fluide et intuitive ? J’ai voulu atteindre cet objectif avec cette application.
D’abord, j’ai cherché ce qu’on appelle une base de données d’éphémérides. C’est un outil qui permet de localiser les astres dans le ciel à une date et un lieu précis, en se basant sur la rotation de la Terre autour du soleil et autour d’elle-même. Fort heureusement, j’ai pu trouver une librairie de code sous licence libre, Swisseph, qui répondait à ce besoin. Sans ça, nous aurions dû recourir à des services web, et on voulait limiter ça le plus possible.
🌘 L’architecture de l’application : un duo efficace
Comment créer une application Python pour générer des cartes du ciel astrologiques ?
La bibliothèque Swisseph permet de localiser les astres à une date et un lieu précis. Une architecture FastAPI pour le calcul et Streamlit pour le frontal permet de créer une application interactive. ReportLab génère ensuite les PDF personnalisés avec les positions des planètes et des symboles astrologiques.
J’ai opté pour une architecture classique en développement logiciel : un client frontal et un service web du côté du serveur. Comme ça, je pouvais utiliser deux outils indépendants entre eux, reliés avec un contrat de données. J’ai choisi deux technologies que je maîtrise bien, Streamlit pour le frontal et FastAPI pour le côté serveur.
- Le frontal (Streamlit) : C’est l’interface que l’utilisatrice voit, celle qui permet d’interagir avec l’application. J’ai choisi Streamlit pour sa simplicité et sa rapidité de développement. Il permet de créer des applications de données interactives sans se noyer dans la complexité du développement web traditionnel.
Mes principaux critères étaient:
-
une application interactive en une seule page
-
rechercher des lieux sur une carte géographique
-
saisir facilement la date et l’heure de naissance.
-
Le côté serveur (FastAPI) : FastAPI est un cadre d’applications Python moderne, rapide et performant, idéal pour construire des APIs robustes sans avoir à se casser la tête avec les protocoles web. La sécurité et les modèles de données font partie intégrante de FastAPI, contrairement aux librairies minimalistes comme Flask. Ici, c’est le cerveau de la création des visuels. Il gère tous les calculs complexes pour la génération de la carte du ciel et, ensuite, il permet de lancer la création des documents. Tout ça se fait en communiquant à l’aide du protocole HTTP sur une interface de programmation (API) REST.
🌘 Les modèles de données : la structure de notre application
Avant de plonger dans le code, il est important de comprendre la structure de données que nous utilisons. Grâce à Pydantic, j’ai défini des modèles typés qui garantissent la cohérence de nos données entre le frontal et le côté serveur de l’application.
Ces modèles sont la fondation de notre application :
BirthInfo: contiens toutes les informations nécessaires pour les calculs astrologiques : date, heure, fuseau horaire et coordonnées géographiques.AstroElement: représente un corps céleste ou un point important (comme l’Ascendant) avec sa position en degrés et son signe du zodiaque.AstologyResponse: contiens tous les résultats des calculs astrologiques, avec chaque planète et l’Ascendant représentés par unAstroElement, ainsi que la liste des positions des maisons.DocumentInfo: rassemble toutes les informations nécessaires pour générer le document PDF, y compris les informations du client et sa date de naissance.
# backend/app/models.py
from pydantic import BaseModel, Field
from typing import List
class BirthInfo(BaseModel):
birth_date: str
birth_time: str
timezone: str
longitude: float
latitude: float
class AstroElement(BaseModel):
position: float # Position en degrés
signe: str # Signe du zodiaque
class AstrologyResponse(BaseModel):
soleil: AstroElement
lune: AstroElement
mercure: AstroElement
venus: AstroElement
mars: AstroElement
jupiter: AstroElement
saturne: AstroElement
uranus: AstroElement
neptune: AstroElement
pluton: AstroElement
ascendant: AstroElement
houses: List[float]
class DocumentInfo(BaseModel):
nom_client: str = Field(description="Nom du client")
courriel_client: str = Field(description="Courriel du client")
info_naissance: BirthInfo = Field(description="Informations sur la date de naissance")
local: bool = False