如何替换curdoc

How to replace curdoc

如何替换散景服务器应用程序中的当前文档?

我将以前的文档另存为 json_string。如果我这样做

set_curdoc(Document.from_json_string(json_string))

这似乎可以正确更改 curdoc(),但是新文档不会显示在浏览器中。

我找到了解决方法,其他地方建议更新现有布局的子项而不是更新整个 curdoc()。

我做到了,但我必须扩展一点才能从保存在 json 字符串中的文档中做到这一点。

我不得不将所有模型的 document 属性从导入的文档切换到 curdoc() (否则它会抱怨模型属于另一个文档)

假设我导入的文档和当前文档都只有一个根:

new_doc = Document.from_json_string(json_string)

new_grid_models = collect_models(new_doc.roots[0])

for elem in new_grid_models:
    try:
        elem.document = curdoc()
    except AttributeError:
        elem._document = curdoc()

new_children = new_doc.roots[0].children
del new_doc

grid.children = new_children

之后 python 回调需要重新影响适当的导入模型。

我在这里放了一个示例应用程序: save_and_load app on Bitbucket

您可以只清除当前文档,然后添加一个新文档:

  1. 将创建文档(bokeh 应用程序)的全部代码放入一个函数中 create_curdoc()。在这个函数的最后你有 curdoc().add_root(layout).
  2. 调用函数create_curdoc()一次创建并显示文档
  3. curdoc().clear()
  4. 清除当前文档
  5. 使用更新后的数据再次调用函数 create_curdoc()(或创建文档的另一个函数)以创建并显示新文档。
    如果您在再次调用该函数之前不清除,则新文档将添加到旧文档的底部。

例如,您可以通过当前文档中的按钮回调触发更新。

按钮设置可能如下所示:

def replace():
    curdoc().clear()
    create_curdoc()

replace_button = Button(
    label="Replace Document",
    button_type= "danger")

replace_button.on_click(replace)