Organisation du code Streamlit
Pour la plupart des apps simples, gardez tout dans un seul fichier—c'est plus propre et plus direct. Le fichier app devrait se lire comme un script Python normal pour le traitement de données, avec quelques commandes Streamlit parsemées.
Nommez le fichier principal streamlit_app.py (la valeur par défaut de Streamlit).
Quand diviser le code
Garder dans un seul fichier (la plupart des apps) :
- Apps de moins de ~1000 lignes
- Scripts ponctuels et prototypes
- Apps où la logique est simple
Envisager une division quand :
- Le traitement de données est complexe (50+ lignes de code non-UI)
- Plusieurs pages partagent la logique
- Vous voulez tester la logique métier séparément
Si la division a du sens, voici comment l'organiser.
Structure de répertoire
my-app/
├── streamlit_app.py # Point d'entrée principal
├── app_pages/ # Modules UI des pages
│ ├── dashboard.py
│ └── settings.py
└── utils/ # Logique métier et utilitaires
├── data.py
└── api.py
Séparer l'UI de la logique
Quand vous divisez, gardez les fichiers Streamlit centrés sur l'UI et déplacez la logique complexe vers des modules utilitaires :
# streamlit_app.py - Centré sur l'UI
import streamlit as st
from utils.data import load_sales_data, compute_metrics
st.title("Sales Dashboard")
start = st.date_input("Start")
end = st.date_input("End")
data = load_sales_data(start, end)
metrics = compute_metrics(data)
st.metric("Revenue", f"${metrics['revenue']:,.0f}")
st.dataframe(data)
Éviter if name == "main"
Les apps Streamlit exécutent le fichier entier à chaque interaction. N'utilisez pas la protection main dans les fichiers Streamlit.
# MAUVAIS - ne faites pas cela dans streamlit_app.py ou pages
if __name__ == "__main__":
main()
# BON - mettez le code directement
import streamlit as st
st.title("My App")
La protection main est acceptable dans les modules utilitaires pour des tests rapides :
# utils/data.py
def load_data(path):
...
# Optionnel : testez ce module directement avec `python utils/data.py`
if __name__ == "__main__":
print(load_data("test.csv"))