added handling multiple browser sessions
This commit is contained in:
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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")
|
||||||
|
Reference in New Issue
Block a user