using-streamlit-session-state

Par streamlit · agent-skills

Utilisation de `st.session_state` pour gérer l'état entre les rechargements Streamlit. À utiliser pour persister des données, gérer l'état des widgets, implémenter des callbacks ou déboguer des problèmes d'état. Couvre les patterns d'initialisation, l'association widget-état et les erreurs courantes.

npx skills add https://github.com/streamlit/agent-skills --skill using-streamlit-session-state

Utiliser l'état de session Streamlit

Streamlit réexécute les scripts de haut en bas à chaque interaction. Sans état de session, les variables se réinitialisent à chaque fois. Utilisez st.session_state pour persister les valeurs entre les réexécutions.

Utilisation basique

L'état de session est un objet de type dictionnaire supportant la notation par attribut et par crochets :

# Initialiser avec setdefault (préféré)
st.session_state.setdefault("count", 0)

# Alternative : vérifier avant de définir
if "count" not in st.session_state:
    st.session_state.count = 0

# Lire
current = st.session_state.count

# Mettre à jour
st.session_state.count += 1
st.session_state["count"] = 5  # La notation par crochets fonctionne aussi

# Supprimer
del st.session_state.count

Accéder à des clés non initialisées lève KeyError. Utilisez st.session_state.get("key", default) pour un accès sécurisé.

Association widget-état

Chaque widget avec un paramètre key se synchronise automatiquement avec l'état de session :

name = st.text_input("Name", key="user_name")
# st.session_state.user_name contient la même valeur que `name`

Callbacks

Les callbacks s'exécutent avant la réexécution du script, permettant les changements d'état immédiat. Utilisez on_change ou on_click avec args et kwargs optionnels :

def increment(amount):
    st.session_state.count += amount

st.button("Add 5", on_click=increment, args=(5,))

Accédez à la valeur d'un widget dans son propre callback via st.session_state.key, et non la variable retournée.

Motifs d'initialisation

Initialisez tout l'état en haut de votre app pour plus de clarté :

st.session_state.setdefault("user", None)
st.session_state.setdefault("page", "home")
st.session_state.setdefault("filters", {})

État multi-pages

Les widgets ne sont PAS stateful entre pages. Leurs valeurs se réinitialisent lors de la navigation entre pages.

Partager l'état

Utilisez les variables d'état de session (pas les clés de widgets) pour partager les données :

# Page 1 : Stocker la valeur
st.session_state.selected_user = st.selectbox("User", users)

# Page 2 : Lire la valeur stockée
if "selected_user" in st.session_state:
    st.write(f"Selected: {st.session_state.selected_user}")

Motif des widgets partagés

Mettez les widgets communs dans le fichier point d'entrée (avant nav.run()) :

# app.py (point d'entrée)
with st.sidebar:
    st.session_state.theme = st.selectbox("Theme", ["Light", "Dark"])

nav = st.navigation(pages)
nav.run()

Erreurs courantes

État mutable au niveau du module

# MAUVAIS : Dans les modules importés, ceci est partagé entre TOUS les utilisateurs
# utils.py
cache = {}  # Persiste entre réexécutions ET utilisateurs !

# BON : Utilisez l'état de session pour les données par utilisateur
st.session_state.setdefault("cache", {})

Modifier l'état après la création du widget

On ne peut pas assigner à l'état d'un widget après son rendu :

st.slider("Value", key="my_slider")
st.session_state.my_slider = 50  # Lève StreamlitAPIException !

Mélanger le paramètre value et l'état de session

Ne définissez pas les deux—cela provoque des avertissements :

# MAUVAIS : Sources conflictuelles
st.session_state.setdefault("name", "Alice")
st.text_input("Name", value="Bob", key="name")  # Avertissement !

# BON : Utilisez l'un ou l'autre
st.session_state.setdefault("name", "Alice")
st.text_input("Name", key="name")

Caractéristiques de la session

  • Par utilisateur, par onglet : Chaque onglet du navigateur a sa propre session
  • Temporaire : Perdue quand l'onglet se ferme ou le serveur redémarre
  • Non adaptée à la persistance : Utilisez les bases de données pour le stockage permanent

Références

Skills similaires