保持散景小部件在应用

时间:2017-02-23 15:00:59

标签: python widget bokeh

我想做什么

为我的工作组制作一种仪表板服务器,可以选择他想要的仪表板。仪表板包含的图和小部件通常不能由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?

1 个答案:

答案 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