在Flask提供的正在运行的Bokeh服务器实例上更改Python中的HTML元素

时间:2018-02-21 10:20:02

标签: python web-services flask webserver bokeh

我一直在尝试运行由Flask处理的Bokeh应用服务器。

我运行Bokeh服务器并主要使用https://github.com/bokeh/bokeh/blob/0.12.14/examples/howto/server_embed/flask_embed.py中的代码嵌入应用程序 我改变了一些关于stackoverflow和邮件组的各种主题的内容,并在现在进行了好几天的实验。

然后我成功地将一些基于on_change属性的回调挂钩到我的元素:

for w in [offset, amplitude, phase, freq]:
    w.on_change('value', update_data)

def update_data(attrname, old, new):
    # Get the current slider values
    amplitude_value = amplitude.value
    offset_value = offset.value
    phase_value = phase.value
    freq_value = freq.value

    # Generate the new curve
    x = np.linspace(0, 4*np.pi, N)
    y = amplitude_value*np.sin(freq_value*x + phase_value) + offset_value
    source.data = dict(x=x, y=y)

    #Here i would need to find some DIV on the website and change it based on the calculated value
    calculated_thing = calculate_something_really_complicated(amplitude_value,offset_value,phase_value,freq_value)

    #Find a DIV on webpage and change it.

问题是,我想从这些滑块获取输出值(动态地更改,到服务器)并基于该输出我想在Python函数中计算一些我将传递给HTML元素的内容结果页面。在这里使用这些值可以静态地工作一次(如同意图一样,因为函数只传递一次,为这些对象设置监听器)。问题是我想改变的那些元素本身不是Bokeh小部件,而是我在这个网页上的DIV和其他HTML元素。如果我可以从Python轻松创建/更新DIV,我想我也可以管理。

我可以通过以下方式获得此功能:在每个滑块上使用自定义JS Callback:

w.js_on_change('value', CustomJS(args=dict(amplitude=amplitude, offset=offset, phase=phase, freq=freq),code=js_code))
js_code = """
doc = document.getElementById("dynamic_equation");
doc.textContent = amplitude.value + "sometext" + offset.value;
"""

不幸的是我无法做这件事,我只想用JS,因为我想利用Sympy根据这些值计算一些方程并返回输出。

我可以提供任何澄清和进一步的代码(现在约有130行+模板)。

1 个答案:

答案 0 :(得分:1)

我看不到一个好的解决方案,因为我没有看到python代码如何能够改变一些不受其控制的HTML代码。但我认为有几种解决方法:

  • 使用div bokeh widget。它看起来像任何其他div元素,除了它是由散景服务器生成

  • 你甚至可以想象一些肮脏的技巧来隐藏散景生成的div,并用一些JS将其内容复制到你的div ......

  • 为了您的信息,散景服务器可以使用html template with custom css,但目前仅限于创建一个包含所有散景文档(绘图/小部件)的全局div。增强此功能是{的目标{3}}。它将允许散景服务器生成在html模板

  • 的不同部分中使用的代码