将散景文档部署到服务器

时间:2020-01-28 20:27:11

标签: deployment server panel bokeh renderer

我正在遵循下面随附的示例代码。当前,它显示由笔记本中“ modify_doc”函数返回的文档中嵌入的图和关联的滑块。但是,我想将其部署到自己的服务器中以制作GUI,同时仍保持其在更改滑块和更新绘图时运行回调的能力。但是,当我尝试使用Panel Pyviz进行部署时,它只会在弹出的服务器上显示消息“ ”。如何以显示图像的方式部署文档?

import numpy as np
import holoviews as hv

from bokeh.io import show, curdoc
from bokeh.layouts import layout
from bokeh.models import Slider, Button

renderer = hv.renderer('bokeh').instance(mode='server')

# Create the holoviews app again
def sine(phase):
    xs = np.linspace(0, np.pi*4)
    return hv.Curve((xs, np.sin(xs+phase))).opts(width=800)

stream = hv.streams.Stream.define('Phase', phase=0.)()
dmap = hv.DynamicMap(sine, streams=[stream])

# Define valid function for FunctionHandler
# when deploying as script, simply attach to curdoc
def modify_doc(doc):
    # Create HoloViews plot and attach the document
    hvplot = renderer.get_plot(dmap, doc)

    # Create a slider

    def slider_update(attrname, old, new):
        # Notify the HoloViews stream of the slider update 
        stream.event(phase=new)

    start, end = 0, np.pi*2
    slider = Slider(start=start, end=end, value=start, step=0.2, title="Phase")
    slider.on_change('value', slider_update)

    # Combine the holoviews plot and widgets in a layout
    plot = layout([
    [hvplot.state],
    [slider]], sizing_mode='fixed')

    doc.add_root(plot)
    return doc

# To display in the notebook
show(modify_doc, notebook_url='localhost:8888')

# To display in a script
doc = modify_doc(curdoc()) 

# To deploy to separate server using Panel (attempt, doesn't work. Just displays #"<bokeh.document.document.Document object at 0x00000193EC5FFE80>":

graph = pn.Row (doc)
graph.show()

1 个答案:

答案 0 :(得分:0)

您的示例中混合了许多非常不同的API。 Panel旨在简化Bokeh的一些API,因此您在这里所做的很多事情都是不必要的。也就是说,我将提供一些版本,这些版本要么仅使用Panel组件,要么将Panel和bokeh组件组合在一起。

首先,这就是我仅使用Panel编写示例的方式:

import numpy as np
import panel as pn
import holoviews as hv

pn.extension()

start, end = 0, np.pi*2
slider = pn.widgets.FloatSlider(start=start, end=end, value=start, step=0.2, name="Phase")

@pn.depends(phase=slider.param.value)
def sine(phase):
    xs = np.linspace(0, np.pi*4)
    return hv.Curve((xs, np.sin(xs+phase))).opts(width=800)

dmap = hv.DynamicMap(sine)

row = pn.Row(dmap, slider)

# Show in notebook
row.app('localhost:8888')

# Open a server
row.show()

# To deploy this using `panel serve` or `bokeh serve`
row.servable()

在您的示例中,您改用了各种bokeh组件,这也是可能的,如果您已经有了bokeh代码,这可能是理想的。

import numpy as np
import holoviews as hv
import panel as pn

from bokeh.models import Slider, Button

# Create the holoviews app again
def sine(phase):
    xs = np.linspace(0, np.pi*4)
    return hv.Curve((xs, np.sin(xs+phase))).opts(width=800)

stream = hv.streams.Stream.define('Phase', phase=0.)()
dmap = hv.DynamicMap(sine, streams=[stream])

def slider_update(attrname, old, new):
    # Notify the HoloViews stream of the slider update 
    stream.event(phase=new)

start, end = 0, np.pi*2
slider = Slider(start=start, end=end, value=start, step=0.2, title="Phase")
slider.on_change('value', slider_update)

graph = pn.Row(dmap, slider)

# Show in notebook
row.app('localhost:8888')

# Open a server
row.show()

# To deploy this using `panel serve` or `bokeh serve`
row.servable()

如果您想将这些应用程序提供给多个人,我绝对建议您使用panel serve,但是如果您确实想制作一个可以与python script.py一起运行的脚本,则应该这样做:

def app():
    start, end = 0, np.pi*2
    slider = pn.widgets.FloatSlider(start=start, end=end, value=start, step=0.2, name="Phase")

    @pn.depends(phase=slider.param.value)
    def sine(phase):
        xs = np.linspace(0, np.pi*4)
        return hv.Curve((xs, np.sin(xs+phase))).opts(width=800)

    dmap = hv.DynamicMap(sine)
    return pn.Row(dmap, slider)

pn.serve({'/': app})

这需要最新的Panel,但要确保即使您以脚本的形式运行该应用程序,每个用户也会获得该应用程序的一个新实例,该实例不会与其他所有用户共享状态。