为我的工作组制作一种仪表板服务器,可以选择他想要的仪表板。仪表板包含的图和小部件通常不能由js处理,而是由python回调函数处理。
我有一个正在运行的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()
。
阅读散景服务器文档我认为散景服务器不处理loop_until_closed
,而是从应用程序处理。
我无法弄清楚如何在不阻止应用的情况下制作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?
答案 0 :(得分:1)
loop_until_closed
功能始终处于阻止状态。这一点在本节第一篇文章的文档中有说明:
http://bokeh.pydata.org/en/latest/docs/user_guide/server.html#connecting-with-bokeh-client
你唯一的选择是在一个线程中运行该函数,但为每个连接执行该操作可能很笨重。该部分还指出,如果您想扩展应用程序(即部署比本地更多),使用bokeh.client
的应用程序实际上不是合适的工具:
如果您需要扩展Bokeh应用程序,最好直接在Bokeh服务器上运行它们。
直接在散景服务器上运行意味着制作一个与
一起运行的app.py
bokeh serve app.py
如本节所述:
http://bokeh.pydata.org/en/latest/docs/user_guide/server.html#building-bokeh-applications
然后,可以使用autoload_server
或IFrame将此应用嵌入到Flask应用中。
否则,您现在也可以启动Bokeh服务器作为"库"通过在您创建和控制的IOLoop
上显式运行服务器。这意味着您可以运行Bokeh服务器"内部"一个Flask应用程序。示例(包括Flask)与此处链接:
http://bokeh.pydata.org/en/latest/docs/user_guide/server.html#embedding-bokeh-server-as-a-library