背景虚化;将数据存储到session_context或其他?

时间:2018-01-16 15:17:17

标签: bokeh

我想为每个用户(会话)存储一些数据。我尝试将它注入curdoc().session_context但它似乎不是一个简单的数据结构,如dict,它是一个SessionContext对象,而且,从阅读文档,我不知道如何操纵它(或它出现它并不意味着):https://bokeh.pydata.org/en/latest/docs/reference/document.html

如何在会话被销毁时为每个被销毁的用户存储一些任意本地数据?

2 个答案:

答案 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仅导入每个类一次,因此所有会话/用户都共享类变量。