Streamlit : Créez des interfaces web interactives en Python

Découvrez comment transformer vos scripts Python en interfaces web interactives sans effort avec Streamlit.

Publié le par Gabriel Trouvé (mis à jour le )
33 minutes

En Python, il arrive souvent de créer des scripts pour automatiser des tâches ou analyser des informations. Mais comment faciliter le partage de ces scripts avec des collègues non développeurs sous la forme d'une interface simple et intuitive ? Un problème courant, notamment dans la data science.

Pour ma part, j'ai été confronté à ce problème quand je travaillais dans le commerce. J'avais des scripts qui permettaient la manipulation et l'analyse de fichiers Excel, mais sans interface... L'idée était alors de créer une interface sans utiliser de framework backend comme Flask ou Django.

Streamlit est devenu mon ami 😊.

Qu'est-ce que Streamlit ?

Streamlit est une bibliothèque open-source qui permet de créer et de partager facilement des applications web. Principalement conçue pour la data science et le machine learning, elle peut être utilisée comme bon vous semble ! Il est alors possible de créer tout type d'application web interactive.

La bibliothèque vous permet de développer des interfaces en Python sans avoir besoin de connaître HTML, CSS ou JavaScript.

Site internet Streamlit

Site internet Streamlit

Mentorats Streamlit sur Docstring

Sur Docstring nous avons des mentorats sur Streamlit, disponibles en rediffusion (et nous allons en refaire d'autres !). Vous pouvez retrouver tous les mentorats de Pierre-André sur le sujet via ce lien.

Pour ma part, nous avons réalisé deux petites applications en mentorat sur Docstring :

Tchat en temps réel

Tchat en temps réel

Tchat en temps réel salon

Tchat en temps réel salon

Installation et première application

Préparation et installation

Créez un dossier streamlit_exemple, naviguez à l'intérieur puis créez votre environnement virtuel et activez-le. Ensuite, installez Streamlit via pip ou tout autre gestionnaire :

pip install streamlit
SHELL
Installation de Streamlit

Installation de Streamlit

Création d'une petite application

Nous allons maintenant créer un fichier index.py et lancer un IDE, puis copier coller ce code dans index.py :

import streamlit as st

st.title("Mon application Streamlit")
st.write("Bienvenue!")

if st.button("Cliquez ici"):
    st.write("Vous avez cliqué sur le bouton !")
PYTHON

Vous pouvez maintenant lancer votre application avec la commande :

streamlit run index.py
PYTHON

Vous remarquerez que l'application se lance dans votre navigateur.

Lancement de l'application

Lancement de l'application

Votre terminal affiche deux adresses :

Adresses Streamlit

Adresses Streamlit

  • Local URL : C'est l'adresse qui permet d'accéder à l'application sur votre ordinateur

  • Network URL : C'est l'adresse que vous pouvez partager avec d'autres personnes connectées au même réseau local pour qu'elles utilisent votre application depuis leur appareil

À noter

Petite anecdote

Lorsque je travaillais dans le commerce, tous les magasins et services supports avaient accès à mon application via cette network URL.

Quelques concepts Streamlit

Prêt à découvrir toute la puissance de Streamlit ?

Le modèle d'exécution séquentiel

À chaque fois qu'un utilisateur interagit avec une application, Streamlit ré-exécute le script du début à la fin. De manière basique, vous n'avez pas à penser à l'état de l'application.

À noter

Pour des applications plus complexes qui nécessitent de se souvenir d'informations, il est possible d'utiliser le mécanisme de gestion d'état intégré st.session_state. Cet objet permet de conserver des informations entre chaque ré-exécution. Couplé à la fonction st.rerun() qui force le script à s'arrêter et redémarrer, vous pouvez contrôler la logique de votre application.

Afficher du contenu et interaction avec l'application

Pour afficher des informations, Streamlit propose plusieurs fonctions :

  • st.title() pour le titre principal

  • st.header() pour un en-tête

  • st.write() capable d'afficher du texte, des dataframes, des dictionnaires etc.

  • st.markdown() pour utiliser du markdown

Extrait de la documentation sur le texte formaté

Extrait de la documentation sur le texte formaté

Si vous voulez vous amuser à tester quelques fonctions :

import streamlit as st

st.title("Mon application Streamlit")

st.header("Section 1")
st.write("Ceci est la première section de l'application.")

st.header("Section 2")
st.write("Ceci est la deuxième section de l'application.")
st.badge("Nouveau", color="green")
st.snow() # Pour le fun
PYTHON
Screen correspondant à l'exemple de code ci-dessus

Screen correspondant à l'exemple de code ci-dessus

Il est aussi possible d'utiliser des widgets interactifs en utilisant des fonctions Streamlit. Besoin d'un curseur ? D'une selectbox ? D'un champ de saisie ? Un bouton de téléchargement ?

import streamlit as st

st.title("Démo des widgets")

# Curseur (Slider)
age = st.slider("Quel est votre âge ?", 0, 100, 25)
st.write(f"Vous avez {age} ans.")

# Liste déroulante (Selectbox)
option = st.selectbox(
    "Quelle est votre couleur préférée ?",
    ("Bleu", "Rouge", "Vert")
)
st.write(f"Votre couleur préférée est : {option}")

# Champ de texte (Text input)
nom = st.text_input("Quel est votre nom ?", "John Doe")
st.write(f"Bonjour, {nom} !")

# Bouton de téléchargement
text_contents = '''
Ceci est un exemple de fichier texte.
Il contient plusieurs lignes.
'''
st.download_button('Télécharger un fichier texte', text_contents)
PYTHON
Démonstration du code ci-dessus

Démonstration du code ci-dessus

Vous pouvez évidemment afficher les informations uniquement lorsque le champ est rempli :

import streamlit as st

st.title("Démo des widgets")

# Champ de texte (Text input)
nom = st.text_input("Quel est votre nom ?")
if nom:
    st.write(f"Bonjour, {nom} !")
PYTHON

Construire des interfaces

Streamlit utilise les context managers pour gérer la mise en page :

import streamlit as st

st.header("Démo de la mise en page")

col1, col2 = st.columns(2)

with col1:
    st.subheader("Colonne de gauche")
    st.write("Ce contenu est dans la première colonne.")
    st.checkbox("Cochez-moi !")

with col2:
    st.subheader("Colonne de droite")
    st.write("Ce contenu est dans la seconde colonne.")
    st.radio("Choisissez une option", ["A", "B", "C"])
PYTHON
Exemple de mise en forme avec les colonnes

Exemple de mise en forme avec les colonnes

On pourrait aussi imaginer st.sidebar pour une barre latérale, ou st.expander pour du contenu dépliable...

Afficher des données graphiques

Pandas, Matplotlib, Plotly, Streamlit permettent d'afficher vos visualisations en quelques lignes de code :

import streamlit as st
import pandas as pd
import numpy as np

st.header("Affichage de données et graphiques")

# Création d'un DataFrame Pandas
df = pd.DataFrame(
    np.random.randn(20, 3),
    columns=['a', 'b', 'c']
)

# Afficher un DataFrame interactif
st.dataframe(df)

# Afficher un graphique linéaire
st.line_chart(df)
PYTHON
Démonstration du code ci-dessus

Démonstration du code ci-dessus

Mise en cache

Conscient que l'exécution du script à chaque interaction peut être coûteuse, Streamlit met à notre disposition le décorateur @st.cache_data :

import streamlit as st
import time

@st.cache_data
def calcul_long_et_complexe(a, b):
    # Simule un calcul qui prend du temps
    time.sleep(5)
    return a + b

st.write("Démonstration du cache")

resultat = calcul_long_et_complexe(5, 10)
st.write(f"Le résultat est : {resultat}")

# Si vous interagissez avec ce bouton, le calcul ne sera pas refait
if st.button("Juste pour rafraîchir"):
    st.write("Rafraîchi !")
PYTHON

La première fois, l'application mettra 5 secondes à charger. Puis avec le décorateur, en cas de rafraîchissement de la page le chargement sera instantané.

Pour aller plus loin

Application multi-pages

Pour des applications plus complexes, il peut parfois être utile de créer plusieurs pages. Streamlit permet de créer des applications multi-pages facilement :

  • Créez un dossier pages à la racine de votre projet

  • Ajoutez des fichiers Python dans ce dossier. Ainsi, chaque fichier correspondra à une nouvelle page

Streamlit utilise le nom du fichier comme titre dans la barre de navigation. Le mieux est d'ordonner les pages en préfixant les noms des fichiers avec un numéro et un underscore (1_page.py).

Application multi-pages (vue de l'IDE)

Application multi-pages (vue de l'IDE)

Aperçu de l'application

Aperçu de l'application

Gestion des secrets

Streamlit intègre une gestion des secrets très simple, afin de ne pas exposer vos clés d'API ou vos mots de passe dans le code.
Encore une fois, Streamlit intègre un mécanisme très simple :

  • Créez un dossier .streamlit à la racine du projet

  • Dans ce dossier, créez un fichier nommé secrets.toml

  • Ajoutez vos informations sensibles dans ce fichier

secrets.toml

secrets.toml

Voici un exemple de code montrant comment on pourrait utiliser notre mot de passe :

  • Dans le fichier secrets.toml
password = "my_secret_password_123"
YAML
  • Puis notre index.py
import streamlit as st

st.set_page_config(
    page_title="Application Multi-Pages",
    page_icon="🏠",
)

# Initialize session state for authentication
if "authenticated" not in st.session_state:
    st.session_state.authenticated = False

# Login form
if not st.session_state.authenticated:
    st.title("Connexion 🔐")

    with st.form("login_form"):
        password_input = st.text_input("Mot de passe", type="password")
        submit = st.form_submit_button("Se connecter")

        if submit:
            if password_input == st.secrets["password"]:
                st.session_state.authenticated = True
                st.rerun()
            else:
                st.error("❌ Mot de passe incorrect")
else:
    # Main application content (only shown when authenticated)
    st.title("Bienvenue dans l'Application Multi-Pages 🏠")

    # Logout button in sidebar
    if st.sidebar.button("Se déconnecter"):
        st.session_state.authenticated = False
        st.rerun()

    st.markdown("""
        Ceci est la page principale d'une application Streamlit multi-pages.

        ### Navigation
        Utilisez la barre latérale pour naviguer entre les différentes pages :
        - **Accueil** (cette page) - Introduction et aperçu
        - **Tableau de Bord** - Visualiser et analyser les données
        - **Paramètres** - Configurer l'application

        ### Démarrage
        Sélectionnez une page dans la barre latérale pour explorer les différentes fonctionnalités !
    """)

    st.info("💡 Astuce : Les applications multi-pages créent automatiquement une navigation depuis le dossier pages/")
PYTHON

Ici nous combinons l'utilisation du mot de passe à la session de Streamlit pour passer de st.session_state.authenticated = False à st.session_state.authenticated = True afin de pouvoir accéder au contenu.

Formulaire de connexion

Formulaire de connexion

Connexion réussie

Connexion réussie

L'écosystème de composants

La communauté Streamlit est très active et possède une bibliothèque de composants. Voici quelques exemples :

  • Des cartes interactives avec streamlit-folium

  • Des tables de données avec streamlit-aggrid

  • Des interfaces du style chatbot avec streamlit-chat

  • Et beaucoup d'autres disponibles sur la galerie officielle

Galerie de composants Streamlit

Galerie de composants Streamlit

Explorez l'API

Nous avons vu quelques fonctionnalités de Streamlit. N'hésitez pas à aller faire un tour sur la documentation, vous allez découvrir énormément de fonctionnalités. Vous pourrez voir par exemple comment charger des fichiers, créer une barre de progression, etc.

Si vous souhaitez pousser le concept, n'hésitez pas à développer une API afin de la coupler avec Streamlit 🔥!

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.