Structure de projet
Pourquoi ça compte
Un projet mal structuré est difficile à reprendre, à déployer ou à transmettre. Deux problèmes reviennent systématiquement :
- Les dépendances ne sont pas listées — le projet ne fonctionne pas sur une autre machine
- Les secrets (clés API, mots de passe) sont dans le code — ils se retrouvent sur GitHub
Les deux se règlent en quelques minutes.
Structure de référence
Arborescence recommandée pour un projet Flask + Streamlit :
mon-dashboard/
├── .streamlit/
│ ├── config.toml # configuration Streamlit (thème, port)
│ └── secrets.toml # secrets locaux (NE PAS commiter)
├── api/
│ ├── __init__.py
│ ├── app.py # application Flask
│ ├── blueprints/
│ │ └── ventes.py
│ └── repository.py
├── dashboard/
│ ├── __init__.py
│ ├── api_client.py # client HTTP (séance 5)
│ └── pages/
│ ├── 1_Ventes.py
│ └── 2_Statistiques.py
├── db/
│ └── ventes.db
├── .env # variables d'environnement locales (NE PAS commiter)
├── .gitignore # fichiers à exclure de Git
├── app.py # point d'entrée Streamlit
├── README.md # documentation minimale
└── requirements.txt # dépendances Python
Séparation des responsabilités
L'API Flask et le dashboard Streamlit vivent dans des dossiers séparés (api/ et dashboard/). Le point d'entrée app.py à la racine lance Streamlit.
requirements.txt
requirements.txt liste les dépendances du projet avec leurs versions. C'est ce qui permet de reproduire l'environnement sur une autre machine ou un serveur de déploiement.
Générer automatiquement depuis l'environnement actuel
pip freeze > requirements.txt
pip freeze liste toutes les bibliothèques installées dans l'environnement courant avec leurs versions exactes. Le résultat ressemble à :
flask==3.0.3
flask-cors==4.0.1
streamlit==1.35.0
plotly==5.22.0
pandas==2.2.2
requests==2.32.3
python-dotenv==1.0.1
Installer depuis un requirements.txt existant
pip install -r requirements.txt
Cette commande installe les dépendances listées dans le fichier, aux versions spécifiées. C'est la première commande à exécuter après avoir cloné un projet.
Attention à pip freeze sur un environnement global
Si vous exécutez pip freeze sans environnement virtuel, le fichier contiendra toutes les bibliothèques installées sur votre système — y compris celles qui n'ont rien à voir avec le projet. Travaillez toujours dans un environnement virtuel.
Environnement virtuel Python
Un environnement virtuel isole les dépendances du projet de l'installation système Python. Chaque projet a ses propres versions de bibliothèques, sans conflit.
python -m venv venv # créer l'environnement virtuel
source venv/bin/activate # activer (Linux/Mac)
venv\Scripts\activate # activer (Windows)
pip install -r requirements.txt
Bonne pratique
Créez un environnement virtuel pour chaque projet. Cela garantit que pip freeze ne listera que les dépendances réellement utilisées par ce projet.
Que produit la commande pip freeze ?
.gitignore
Le fichier .gitignore à la racine du projet liste les fichiers et dossiers que Git ne doit pas suivre : secrets, caches, fichiers générés.
Contenu minimal pour un projet Flask + Streamlit :
# Environnement virtuel
venv/
.venv/
env/
# Secrets — NE JAMAIS commiter
.env
.streamlit/secrets.toml
# Base de données locale
db/*.db
# Cache Python
__pycache__/
*.pyc
*.pyo
.pytest_cache/
# Éditeurs
.vscode/
.idea/
*.swp
# OS
.DS_Store
Thumbs.db
Règle absolue
Ne commitez jamais de fichiers contenant des secrets (.env, secrets.toml, clés API en dur dans le code). Une fois un secret poussé sur GitHub, il est considéré comme compromis — même si vous le supprimez ensuite.
.env pour les variables d'environnement locales
Les variables d'environnement (clé API, URL de base, etc.) sont stockées dans un fichier .env à la racine :
# .env
API_KEY=ma-cle-secrete-dev
FLASK_PORT=5000
DATABASE_PATH=db/ventes.db
Chargement avec python-dotenv :
from dotenv import load_dotenv
import os
load_dotenv() # charge les variables depuis .env
API_KEY = os.environ.get("API_KEY")
DATABASE_PATH = os.environ.get("DATABASE_PATH", "db/ventes.db")
load_dotenv()
load_dotenv() lit le fichier .env et injecte les variables dans os.environ. Il faut l'appeler au démarrage de l'application, avant d'accéder aux variables. En production (Streamlit Community Cloud), les variables d'environnement sont définies dans l'interface web — pas de fichier .env nécessaire.
.env vs .streamlit/secrets.toml
Les deux stockent des secrets, mais pour des usages différents :
| Aspect | .env | .streamlit/secrets.toml |
|---|---|---|
| Format | CLÉ=valeur | CLÉ = "valeur" (TOML) |
| Accès en Python | os.environ["CLÉ"] | st.secrets["CLÉ"] |
| Chargement | load_dotenv() explicite | Automatique par Streamlit |
| Utilisé par | Flask, scripts Python | Streamlit uniquement |
| En production | Variables d'environnement du serveur | Interface Streamlit Community Cloud |
.env.example — documenter sans exposer
.env.example contient les clés attendues sans les valeurs. Contrairement à .env, ce fichier doit être commité — il documente les variables attendues :
# .env.example
API_KEY=
FLASK_PORT=5000
DATABASE_PATH=db/ventes.db
Un nouveau développeur clone le projet, copie .env.example en .env, et renseigne les valeurs manquantes.
Pourquoi le fichier .env.example peut-il être commité alors que .env ne doit pas l'être ?
README.md minimal
Un README bien écrit permet à n'importe qui (y compris vous dans six mois) de comprendre le projet et de le lancer. Structure minimale recommandée :
# Dashboard Ventes
Dashboard analytique des ventes construit avec Flask + Streamlit.
## Installation
git clone <url-du-repo>
cd mon-dashboard
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # puis renseigner les valeurs
## Lancement
# Terminal 1 — API Flask
cd api && flask run
# Terminal 2 — Dashboard Streamlit
streamlit run app.py
## Structure
- `api/` — API Flask (endpoints, repository SQLite)
- `dashboard/` — Application Streamlit (pages, client HTTP)
- `db/` — Base de données SQLite
À retenir
Points clés
requirements.txtliste les dépendances — généré avecpip freeze, installé avecpip install -r- Toujours travailler dans un environnement virtuel pour isoler les dépendances
.gitignoreempêche de commiter secrets, caches et fichiers générés.envstocke les secrets en local,.env.exampledocumente les clés sans valeursload_dotenv()charge.envdansos.environ— à appeler au démarrage- Un
README.mdminimal avec instructions d'installation et de lancement est indispensable