我想做什么

为我的工作组制作一种仪表板服务器,在这里可以选择他想要的仪表板。仪表板由地块和小部件组成,通常无法通过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/

10-13 03:36