So. After searching everywhere, I found a way to create a standard web-app style session in Streamlit using the extra-streamlit-components package’s CookieManager as a bridge between st.session_state
NOTE: It works with any data that can be json encoded
First, create a folder called /sessions in the document root. This is where the session json files will be stored
Full Code here - session.py
import extra_streamlit_components as stx
import streamlit as st
from json import dumps, loads
import osclass Session:
cookie_manager = None
session_id = None
session_vars =@staticmethod def init(): Session.cookie_manager = stx.CookieManager() cookies = Session.cookie_manager.get_all() if 'ajs_anonymous_id' in cookies: Session.session_id = cookies['ajs_anonymous_id'] Session.get_user_session() @staticmethod def get_user_session(): session_file = os.getcwd() + '/sessions/' + Session.session_id + '.json' if os.path.exists(session_file): with open(session_file) as json_file: data = loads(json_file.read()) for i in data: st.session_state[i] = data[i] @staticmethod def append_value(key, value): if key not in st.session_state: st.session_state[key] = [] st.session_state[key].append(value) @staticmethod def set_value(key, value): Session.session_vars.append(key) Session.session_vars = list(set(Session.session_vars)) st.session_state[key] = value Session.save() @staticmethod def get_value(key): return st.session_state[key] if key in st.session_state else None @staticmethod def save(): data = {} for i in Session.session_vars: if i not in st.session_state: continue data[i] = st.session_state[i] session_file = os.getcwd() + '/sessions/' + Session.session_id + '.json' with open(session_file, 'w') as outfile: outfile.write(dumps(data))
Usage is straightforward.
At the beginning of the app, you need to do
from session import Session
Session.init()
This will initialize the session.
After that, instead of using st.session_state, use the following helper functions
Session.set_value(key, value)
Session.get_value(key)
Essentially, with Session.init(), it will load the JSON file into session_state
Every time you set a session value, it will write contents to the session file for persistence.
This may seem hacky, but didn’t find of another way to create an easy interface for persistent session variable management.
If your app uses a session variable to track its state/progress, reloading the page will return it to the same state.