added handling multiple browser sessions

This commit is contained in:
2022-11-25 23:52:44 +01:00
parent a84a4f8faf
commit 37ca97ea37
2 changed files with 26 additions and 16 deletions

View File

@ -1,7 +1,7 @@
import cherrypy as cp import cherrypy as cp
from utils.dfh import DateFrameHolder from utils.dfh import DateFrameHolder
from utils.st_utils import rerun from utils.st_utils import rerunall, get_session_ids
@cp.expose @cp.expose
@ -9,22 +9,33 @@ class TableController:
def __init__(self): def __init__(self):
self.dfh = DateFrameHolder("output.h5") self.dfh = DateFrameHolder("output.h5")
self.sid = None # self.changed = True
self.changed = True self.sids = get_session_ids()
@property def get(self, sid):
def data(self): changed = self.get_changed(sid)
self.changed = False data = self.get_data(sid)
return changed, data
def get_changed(self, sid):
return (sid in self.sids)
def get_data(self, sid):
# self.changed = False
try:
self.sids.remove(sid)
except KeyError as e:
if self.sids:
raise RuntimeError(f"{self.sids} is not empty") from e
return self.dfh.df return self.dfh.df
@data.setter def set_data(self, df):
def data(self, df):
if self.dfh.df.equals(df): if self.dfh.df.equals(df):
print("<<< skipping dump because dataframe did not change") print("<<< skipping dump because dataframe did not change")
return return
self.dfh.df = df self.dfh.df = df
self.dfh.dump() self.dfh.dump()
self._trigger_changed()
def GET(self): def GET(self):
return str(self.dfh.df) return str(self.dfh.df)
@ -44,8 +55,9 @@ class TableController:
def _trigger_changed(self): def _trigger_changed(self):
self.changed = True # self.changed = True
rerun(self.sid) self.sids = get_session_ids()
rerunall()

View File

@ -24,10 +24,8 @@ st.set_page_config(
hide_UI_elements() hide_UI_elements()
restapi.sid = get_session_id() # rest api needs current session ID to trigger the next rerun sid = get_session_id() # rest api needs current session IDs to trigger reruns
changed, df = restapi.get(sid)
changed = restapi.changed
df = restapi.data
download(df) download(df)
@ -77,7 +75,7 @@ response = aggrid(
new_df = response["data"] new_df = response["data"]
if not new_df.equals(df) and not changed: if not new_df.equals(df) and not changed:
restapi.data = new_df restapi.set_data(new_df)
print(">>> end of streamlit run") print(">>> end of streamlit run")