【问题标题】:Dash and data persistence破折号和数据持久性
【发布时间】:2021-12-01 09:49:07
【问题描述】:

我正在使用 python Dash 创建一个多页应用程序。作为这方面的新手,我想知道我是否可以确定一旦加载的数据将保持在内存中?

我的意思是当我有 index.py 文件作为页面选择器时:

@app.callback(Output(component_id='page-content', component_property='children'),
              Input(component_id='url', component_property='pathname'))
def display_page(new_path):

    if new_path.startswith('/apps/Data'):
        return html.P(data.serve_layout())
    elif new_path == '/apps/Projects':
        return html.P(projects.serve_layout())
    else:
        return html.P(landing.serve_layout())

现在页面 /apps/Data (data.py) 有一些输入和按钮,允许用户获取必要的数据。数据存储在全局 Python 变量中(即 Python 类 MyData 的一个实例),如下所示:

data_store = MyData()

@app.callback(
    Output('load_data','name'),
    Input('load_data', 'n_clicks'),
    prevent_initial_call=True)
def load_data (n_clicks):

    data_store.load_data()

    raise dash.exceptions.PreventUpdate

稍后在 /apps/Projects (projects.py) 页面中访问和使用这些数据,如下所示:

from apps.data import data_store

@app.callback(
    Output('show_data','name'),
    Input('show_data', 'n_clicks'),
    prevent_initial_call=True)
def show_data (n_clicks):

    print (data_store.test_show_data())

    raise dash.exceptions.PreventUpdate

现在这个似乎可以工作了,但我真的可以相信 data_store 中的数据是持久的吗?问题是我对 Dash 内存处理不是很了解,所以也可能是当一些垃圾收集器启动时 data_store 突然被删除。或者它可能安全地在同一个应用程序上下文中?

【问题讨论】:

    标签: python persistence plotly-dash


    【解决方案1】:

    这取决于您指定的persistance_type,尽管据我了解,您需要默认类型。来自 Dash 文档...

    local:使用 window.localStorage。这是默认设置,保持 该计算机上该浏览器中无限期的数据

    Dash Persistence Documentation

    window.localStorage 由您的浏览器提供。我还没有测试过,但如果您卸载并重新安装浏览器,我希望它会丢失。它也不能在不同的浏览器中使用。例如,如果您从 Firefox 切换到 Chrome。来自 Monzilla 网络文档...

    窗口界面的localStorage只读属性允许你 访问文档来源的存储对象;存储的数据 跨浏览器会话保存。

    Monzilla MDN Web Docs

    【讨论】:

    • 我认为这个答案是针对不同的问题。也许我应该问,示例中的 data_store 是服务器端还是客户端对象?
    【解决方案2】:

    我认为这一章的文档解释了这个问题:

    https://dash.plotly.com/sharing-data-between-callbacks

    上面写着:

    “您可以在三个地方存储这些数据:

    • 在用户的浏览器会话中,使用 dcc.Store

    • 在磁盘上(例如在文件或数据库中)

    • 在跨进程和服务器(例如 Redis 数据库)共享的服务器端内存 (RAM) 中。 Dash Enterprise 包括用于此目的的板载、一键式 Redis 数据库。”

    我相信我的示例中的 stored_data 实例位于服务器端 RAM 中。

    我想,如果我需要同时拥有多个会话,我可以为每个会话创建一个新的 data_store 实例吗?虽然不知道怎么...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多