我想做什么
为我的工作组制作一种仪表板服务器,在这里可以选择他想要的仪表板。仪表板由地块和小部件组成,通常无法通过js来处理,而只能通过python回调函数来处理。
什么工作
散景服务器和平面服务器
仪表板在bokeh服务器上运行良好。
我有一个正在运行的Flask服务器,并且可以向用户显示所选的dahshboard。仪表板以这种方式扎根:
from bokeh.embed import autoload_server, Document
from flask import Flask, render_template
config = {}
app = Flask(__name__)
app.root("/focusmap")
def serve_focusmap():
dashboard = get_focusmap_dashboard() # a bokeh plot and widget layout
document = Document()
document.add_root(dashboard)
document.title = name
session = push_session(document, session_id=None)
body = autoload_server(None, session_id=session.id)
config['currentSession'] = session
return render_template("board.html", body=body)
这样可以很好地显示仪表板,但是小部件不起作用,因为
session.loop_until_closed()
在某处丢失。读取bokeh服务器文档后,我发现
loop_until_closed
不是由bokeh服务器处理,而是由应用程序处理。什么不起作用
我无法弄清楚如何制作
session.loop_until_closed()
而不阻止应用程序。我试过了 :
@app.after_request
def loopSession(response):
global config
session = config.get('currentSession',None)
if session:
session.loop_until_closed()
return response
但是,它当然会阻止该应用程序。
有人有经验吗?我应该/可以在子进程中运行loop_until_closed吗?
最佳答案
loop_until_closed
函数始终处于阻塞状态。
更新:已从Bokeh 2.0的公共API中删除
您唯一的选择是在线程中运行该函数,但是对于每个连接都这样做很麻烦。该部分还指出,如果您想扩展应用程序(即比本地部署更多的应用程序),那么使用loop_until_closed
确实不是合适的工具:
如果需要扩展Bokeh应用程序,则最好直接在Bokeh服务器上运行它们。
直接在bokeh服务器上运行意味着例如制作一个bokeh.client
bokeh serve app.py
如本节所述:
http://docs.bokeh.org/en/latest/docs/user_guide/server.html#building-bokeh-applications
然后,可以使用
app.py
或IFrame将这个应用嵌入到Flask应用中。否则,您现在还可以通过在您创建和控制的
autoload_server
上显式运行服务器来将Bokeh服务器作为“库”启动。这意味着您可以在Flask应用内部“运行” Bokeh服务器。示例(包括烧瓶)从此处链接:http://docs.bokeh.org/en/latest/docs/user_guide/server.html#embedding-bokeh-server-as-a-library
关于python - 保持bokeh小部件在应用程序中运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42419293/