我想为每个用户(会话)存储一些数据。我尝试将它注入curdoc().session_context
但它似乎不是一个简单的数据结构,如dict,它是一个SessionContext对象,而且,从阅读文档,我不知道如何操纵它(或它出现它并不意味着):https://bokeh.pydata.org/en/latest/docs/reference/document.html
如何在会话被销毁时为每个被销毁的用户存储一些任意本地数据?
答案 0 :(得分:0)
我认为你正在过度思考这个问题。如果要在一个会话中包含的回调之间存储数据,则不需要执行任何特殊操作。您可以(例如)在Bokeh应用程序中定义模块级变量data = {}
,然后回调可以读取和写入dict,但是您需要:
data = {}
def button_callback(attr, old, new):
# write some to session "data store"
data['foo'] = 'bar'
def button_callback():
# read some data from session "data store"
print(data['foo'])
每个会话都会获得自己的data
个实例,任何其他会话都无法访问,只要会话结束,该会话就会消失。
显然这是相当简单的。更复杂的版本可能会定义一个具有良好定义的API的类,用于存储/检索数据,并为要使用的回调创建类的模块级实例,而不是裸dict
。
答案 1 :(得分:0)
使用bokeh serve
使用Bokeh 2.1.1,我发现Python 实例变量对于每个会话都是唯一的,因此它们可以存储特定于会话的数据。例如,在三个浏览器窗口中运行此Bokeh应用程序,然后依次在窗口1、2、3、3、1、2、3中依次单击“测试”按钮-控制台消息显示每个会话都有其自己的唯一mySession值:
class InstanceVar():
def __init__(self, title):
self.testButton = Button(label="Test", button_type="primary")
self.testButton.on_click(self._test)
self.mySession = id(curdoc().session_context)
print("Set mySession={}".format(self.mySession))
def _test(self):
print("mySession={}".format(self.mySession))
但是Python class 变量似乎被所有会话共享;当我以相同的方式运行以下应用程序时,所有三个会话都将打印最近启动的会话的mySession值,因为它们都在内存中使用相同的类变量:
class ClassVar():
mySession = None
def __init__(self, title):
self.testButton = Button(label="Test", button_type="primary")
self.testButton.on_click(self._test)
ClassVar.mySession = id(curdoc().session_context)
print("Set mySession={}".format(ClassVar.mySession))
def _test(self):
print("mySession={}".format(ClassVar.mySession))
因此,我以此为前提,Bokeh Server仅导入每个类一次,因此所有会话/用户都共享类变量。