调整代码以通过 Flask 部署多个散景服务器图
adapting code to deploy multiple bokeh server plots via flask
以下借用自:
https://github.com/bokeh/bokeh/blob/0.12.14/examples/howto/server_embed/flask_embed.py
from flask import Flask, render_template
from bokeh.embed import server_document
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
from bokeh.server.server import Server
from bokeh.themes import Theme
from bokeh.sampledata.sea_surface_temperature import sea_surface_temperature
app = Flask(__name__)
def modify_doc(doc):
df = sea_surface_temperature.copy()
source = ColumnDataSource(data=df)
plot = figure(x_axis_type='datetime', y_range=(0, 25), y_axis_label='Temperature (Celsius)',
title="Sea Surface Temperature at 43.18, -70.43")
plot.line('time', 'temperature', source=source)
def callback(attr, old, new):
if new == 0:
data = df
else:
data = df.rolling('{0}D'.format(new)).mean()
source.data = ColumnDataSource(data=data).data
slider = Slider(start=0, end=30, value=0, step=1, title="Smoothing by N Days")
slider.on_change('value', callback)
doc.add_root(column(slider, plot))
doc.theme = Theme(filename="theme.yaml")
###my bokeh plot ###
def grid():
#import libraries
from bokeh.io import curdoc
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from random import randrange
#create figure
f=figure(x_range=(0,11),y_range=(0,11))
#create columndatasource
source=ColumnDataSource(data=dict(x=[],y=[]))
#create glyphs
f.circle(x='x',y='y',size=8,fill_color='olive',line_color='yellow',source=source)
#create periodic function
def update():
new_data=dict(x=[randrange(1,10)],y=[randrange(1,10)])
source.stream(new_data,rollover=15)
print(source.data)
#add figure to curdoc and configure callback
curdoc().add_root(f)
curdoc().add_periodic_callback(update,1000)
######
@app.route('/', methods=['GET'])
def bkapp_page():
script = server_document('hostname:5006/bkapp')
return render_template("embed.html", script=script, template="Flask")
###NEW ROUTE###
@app.route('/plot')
def grid():
bokeh_script=server_document('hostname:5006/plot')
return render_template("embed.html",script=script, template="Flask")
######
def bk_worker():
server = Server({'/bkapp': modify_doc}, allow_websocket_origin=["hostname:8000"])
server.start()
server.io_loop.start()
from threading import Thread
Thread(target=bk_worker).start()
if __name__ == '__main__':
app.run(port=8000)
我试图修改它,使其不仅在 app.route("/")
处提供散景图 modify_doc
,而且还在 @app.route('/plot')
处提供新的散景图 grid
。添加新的地块和路线后,它完全崩溃,甚至 modify_doc
不再呈现。如何修改以在不同路线上渲染多个地块?提前致谢。就他们自己而言,这些图使用 bokeh serve --show (plotname).py
工作 我尝试过将 grid
中的端口更改为 5007
并传递包含 modify_doc
的 route:bokeh
字典和 grid
到 Server
但都不起作用。
没有时间验证,但这里有一个解决方案,可以从单个 python 脚本
为两个散景服务器提供服务
https://groups.google.com/a/continuum.io/forum/#!msg/bokeh/LYmjTXzX43E/_0dNPR1_CQAJ
我明天去看看
编辑:有效。请注意,它使用的是 Bokeh 0.12.1
以下借用自:
https://github.com/bokeh/bokeh/blob/0.12.14/examples/howto/server_embed/flask_embed.py
from flask import Flask, render_template
from bokeh.embed import server_document
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
from bokeh.server.server import Server
from bokeh.themes import Theme
from bokeh.sampledata.sea_surface_temperature import sea_surface_temperature
app = Flask(__name__)
def modify_doc(doc):
df = sea_surface_temperature.copy()
source = ColumnDataSource(data=df)
plot = figure(x_axis_type='datetime', y_range=(0, 25), y_axis_label='Temperature (Celsius)',
title="Sea Surface Temperature at 43.18, -70.43")
plot.line('time', 'temperature', source=source)
def callback(attr, old, new):
if new == 0:
data = df
else:
data = df.rolling('{0}D'.format(new)).mean()
source.data = ColumnDataSource(data=data).data
slider = Slider(start=0, end=30, value=0, step=1, title="Smoothing by N Days")
slider.on_change('value', callback)
doc.add_root(column(slider, plot))
doc.theme = Theme(filename="theme.yaml")
###my bokeh plot ###
def grid():
#import libraries
from bokeh.io import curdoc
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from random import randrange
#create figure
f=figure(x_range=(0,11),y_range=(0,11))
#create columndatasource
source=ColumnDataSource(data=dict(x=[],y=[]))
#create glyphs
f.circle(x='x',y='y',size=8,fill_color='olive',line_color='yellow',source=source)
#create periodic function
def update():
new_data=dict(x=[randrange(1,10)],y=[randrange(1,10)])
source.stream(new_data,rollover=15)
print(source.data)
#add figure to curdoc and configure callback
curdoc().add_root(f)
curdoc().add_periodic_callback(update,1000)
######
@app.route('/', methods=['GET'])
def bkapp_page():
script = server_document('hostname:5006/bkapp')
return render_template("embed.html", script=script, template="Flask")
###NEW ROUTE###
@app.route('/plot')
def grid():
bokeh_script=server_document('hostname:5006/plot')
return render_template("embed.html",script=script, template="Flask")
######
def bk_worker():
server = Server({'/bkapp': modify_doc}, allow_websocket_origin=["hostname:8000"])
server.start()
server.io_loop.start()
from threading import Thread
Thread(target=bk_worker).start()
if __name__ == '__main__':
app.run(port=8000)
我试图修改它,使其不仅在 app.route("/")
处提供散景图 modify_doc
,而且还在 @app.route('/plot')
处提供新的散景图 grid
。添加新的地块和路线后,它完全崩溃,甚至 modify_doc
不再呈现。如何修改以在不同路线上渲染多个地块?提前致谢。就他们自己而言,这些图使用 bokeh serve --show (plotname).py
工作 我尝试过将 grid
中的端口更改为 5007
并传递包含 modify_doc
的 route:bokeh
字典和 grid
到 Server
但都不起作用。
没有时间验证,但这里有一个解决方案,可以从单个 python 脚本
为两个散景服务器提供服务https://groups.google.com/a/continuum.io/forum/#!msg/bokeh/LYmjTXzX43E/_0dNPR1_CQAJ
我明天去看看
编辑:有效。请注意,它使用的是 Bokeh 0.12.1