curdoc() 的目的是什么?

What is the purpose of curdoc()?

我玩散景已经有一段时间了,现在我想创建交互式图并将它们在线嵌入(例如,在 WordPress 帖子中)。

然而,尽管我花了一些时间审查和测试 bokeh 网站示例中的代码,但我还是很难理解 curdoc() 的确切用途。为了创建一个带有小部件的散景应用程序似乎是必要的,但是根据我在资源中找到的内容,我不太明白它。

一些术语是正确的。当您创建散景图时,它由许多较小的对象组成,例如字形、范围、数据源、工具等。而图本身基本上是所有这些其他对象的容器。所有这些对象,包括 Plot,都称为 Models。其他 模型 是诸如布局(例如 rowcolumn)以及 Bokeh 内置的小部件(例如 SliderSelect).

对于 Python 端的这些模型中的每一个,都有一个相应的 JavaScript 对象实际实现该模型,并在浏览器中完成绘图或交互的所有工作。 Bokeh 的工作方式是它可以自动将 Python 模型的集合变成一堆 JSON,然后 BokehJS 可以从中重新构造所有相应的 JS 对象。

A Document 是 Bokeh Models 的集合。是最小的"unit of serialization"。也就是说,将单个 Python 模型转换为 JSON(如 Plot)通常没有意义,因为该对象可能引用许多其他对象(如轴,或字形等)因此,Bokeh Document 中的一组模型都可以以一种有意义的方式一起变成 JSON。

无论您是制作独立文档(例如使用 output_file),还是在 Bokeh 服务器上创建 Bokeh 应用程序,以上所有内容都适用。对于 Bokeh 应用程序,应用程序代码本身实际上只是 修改文档 的配方。因此,每当创建 Bokeh 应用程序会话时(即每当用户在 Bokeh 服务器上打开 URL 到 Bokeh 应用程序时),都会创建一个新的 blank Document为此,应用程序代码为 运行,其中该会话的新 Document 可用 curdoc()。然后应用程序代码可以向该文档添加内容(例如使用 curdoc().add_root(...) 并且一旦应用程序代码完成,"completed" 文档就会变成 JSON 并发送到 BokehJS 以显示给用户。

最后一点要提到的是,Bokeh 服务器的主要目的是确保以这种方式创建的 Bokeh 文档自动与用户在浏览器中的视图保持同步。如果用户滑动滑块,则会更新浏览器中 JS 文档中的 Slider 模型,这也会自动更新 Bokeh 服务器中 Python 文档中的 python Slider 对象。应用程序可以对此做出响应,并进行其他更改(比如更新 Python 数据源),这会导致 JS 数据源也更新(从而使情节发生变化)。这种自动双向同步为 Bokeh 服务器提供了所有复杂的交互功能。