我正在拼命地将一个正在运行的散景小程序嵌入到烧瓶中,并且找不到合适的方法来执行此操作。我查看了所有示例,但我找不到一个包含更新数据的能力(最好的例子:sliders_applet)。
如果我没弄错的话,我确实需要散景服务器才能更改数据(使用滑块等)。以这种方式启动applet,例如:
bokeh-server --script sliders_app.py
但我找不到合适的,或者至少是一种将sliders_app嵌入烧瓶的工作方式。由于应该可以使用多个applet,因此在散景服务器启动时指定一个小程序似乎并不干净。
我很乐意感谢任何帮助 - 散景看起来对我来说是一个很棒的工具。
由Bokeh项目的核心开发人员之一编辑以下信息不能回答上述问题。如下所述,使用bokeh.embed.components
嵌入Bokeh应用程序是绝对不可能的。 components
只能嵌入独立的文档(即不在Bokeh服务器上运行)
在example of embedding bokeh with flask上有一个the bokeh github repo。
import flask
from bokeh.embed import components
from bokeh.plotting import figure
from bokeh.resources import INLINE
from bokeh.templates import RESOURCES
from bokeh.util.string import encode_utf8
app = flask.Flask(__name__)
colors = {
'Black': '#000000',
'Red': '#FF0000',
'Green': '#00FF00',
'Blue': '#0000FF',
}
def getitem(obj, item, default):
if item not in obj:
return default
else:
return obj[item]
@app.route("/")
def polynomial():
""" Very simple embedding of a polynomial chart"""
# Grab the inputs arguments from the URL
# This is automated by the button
args = flask.request.args
# Get all the form arguments in the url with defaults
color = colors[getitem(args, 'color', 'Black')]
_from = int(getitem(args, '_from', 0))
to = int(getitem(args, 'to', 10))
# Create a polynomial line graph
x = list(range(_from, to + 1))
fig = figure(title="Polynomial")
fig.line(x, [i ** 2 for i in x], color=color, line_width=2)
# Configure resources to include BokehJS inline in the document.
# For more details see:
# http://bokeh.pydata.org/en/latest/docs/reference/resources_embedding.html#module-bokeh.resources
plot_resources = RESOURCES.render(
js_raw=INLINE.js_raw,
css_raw=INLINE.css_raw,
js_files=INLINE.js_files,
css_files=INLINE.css_files,
)
# For more details see:
# http://bokeh.pydata.org/en/latest/docs/user_guide/embedding.html#components
script, div = components(fig, INLINE)
html = flask.render_template(
'embed.html',
plot_script=script, plot_div=div, plot_resources=plot_resources,
color=color, _from=_from, to=to
)
return encode_utf8(html)
def main():
app.debug = True
app.run()
if __name__ == "__main__":
main()
另一个想法是并排运行bokeh-server
和你的flask
网络应用程序,并以这种方式加载散景代码(服务器端或通过JS或iframe),但这可能很麻烦。
另一个答案没有描述如何嵌入Bokeh服务器应用程序(它使用components
嵌入一个独立的Bokeh文档)。
首先,您可以看到许多现场示例:https://demo.bokeh.org/
对于嵌入应用程序,有两种常用选项:
autoload_server
后者通常使用如下:
script = autoload_server(model=None,
app_path="/apps/slider",
url="https://demo.bokehplots.com")
这将返回一个与下面类似的<script>
标记,您可以将其放入烧瓶HTML响应中,无论您希望应用出现在何处:
<script
src="https://demo.bokehplots.com/apps/slider/autoload.js?bokeh-autoload-element=c5c9bdb5-40e8-46a2-9bf0-40a9d396ce97"
id="c5c9bdb5-40e8-46a2-9bf0-40a9d396ce97"
data-bokeh-model-id=""
data-bokeh-doc-id=""
></script>
最后,值得注意的是,默认情况下,Bokeh服务器选择相当保守的网络配置。您需要启动Bokeh服务器,并将--allow-websocket-origin
命令行选项设置为您将散景应用程序嵌入到的任何主机。