added handling multiple browser sessions
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
import cherrypy as cp
|
||||
|
||||
from utils.dfh import DateFrameHolder
|
||||
from utils.st_utils import rerun
|
||||
from utils.st_utils import rerunall, get_session_ids
|
||||
|
||||
|
||||
@cp.expose
|
||||
@ -9,22 +9,33 @@ class TableController:
|
||||
|
||||
def __init__(self):
|
||||
self.dfh = DateFrameHolder("output.h5")
|
||||
self.sid = None
|
||||
self.changed = True
|
||||
# self.changed = True
|
||||
self.sids = get_session_ids()
|
||||
|
||||
@property
|
||||
def data(self):
|
||||
self.changed = False
|
||||
def get(self, sid):
|
||||
changed = self.get_changed(sid)
|
||||
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
|
||||
|
||||
@data.setter
|
||||
def data(self, df):
|
||||
def set_data(self, df):
|
||||
if self.dfh.df.equals(df):
|
||||
print("<<< skipping dump because dataframe did not change")
|
||||
return
|
||||
self.dfh.df = df
|
||||
self.dfh.dump()
|
||||
|
||||
self._trigger_changed()
|
||||
|
||||
def GET(self):
|
||||
return str(self.dfh.df)
|
||||
@ -44,8 +55,9 @@ class TableController:
|
||||
|
||||
|
||||
def _trigger_changed(self):
|
||||
self.changed = True
|
||||
rerun(self.sid)
|
||||
# self.changed = True
|
||||
self.sids = get_session_ids()
|
||||
rerunall()
|
||||
|
||||
|
||||
|
||||
|
@ -24,10 +24,8 @@ st.set_page_config(
|
||||
hide_UI_elements()
|
||||
|
||||
|
||||
restapi.sid = get_session_id() # rest api needs current session ID to trigger the next rerun
|
||||
|
||||
changed = restapi.changed
|
||||
df = restapi.data
|
||||
sid = get_session_id() # rest api needs current session IDs to trigger reruns
|
||||
changed, df = restapi.get(sid)
|
||||
|
||||
|
||||
download(df)
|
||||
@ -77,7 +75,7 @@ response = aggrid(
|
||||
|
||||
new_df = response["data"]
|
||||
if not new_df.equals(df) and not changed:
|
||||
restapi.data = new_df
|
||||
restapi.set_data(new_df)
|
||||
|
||||
|
||||
print(">>> end of streamlit run")
|
||||
|
Reference in New Issue
Block a user