Flask-Bokeh-Gunicorn:模型必须由单个文档拥有

时间:2018-07-27 19:00:07

标签: python flask bokeh gunicorn

这是与Flask应用程序一起运行Flask应用程序的代码,灵感来自于 flask_gunicorn_embed.py on Github

起初,它像一种魅力。但是,刷新页面后,会发生此错误。

  

模型必须仅由一个文档拥有:...(其余部分被截断)   

顺便说一下,代码是使用gunicorn运行的。
此外,create_figure()函数将返回layout

from Decision_Tree.Plot.decision_tree import create_figure
if __name__ == '__main__':
    import sys
    sys.exit()

app = Flask(__name__)


def modify_doc(doc):
    # Create the plot
    plot = create_figure()
    # Embed plot into HTML via Flask Render
    doc.add_root(plot)

bkapp = Application(FunctionHandler(modify_doc))

# This is so that if this app is run using something like "gunicorn -w 4" then
# each process will listen on its own port
sockets, port = bind_sockets("x.x.x.x", 0)


@app.route('/', methods=['GET'])
def bkapp_page():
    script = server_document('http://x.x.x.x:%d/bkapp' % port)
    return render_template("index.html", script=script, template="Flask")


def bk_worker():
    asyncio.set_event_loop(asyncio.new_event_loop())

    bokeh_tornado = BokehTornado({'/bkapp': bkapp}, extra_websocket_origins=["x.x.x.x:5000"])
    bokeh_http = HTTPServer(bokeh_tornado)
    bokeh_http.add_sockets(sockets)

    server = BaseServer(IOLoop.current(), bokeh_tornado, bokeh_http)
    server.start()
    server.io_loop.start()


from threading import Thread
Thread(target=bk_worker).start()

期待任何帮助! 附言域被故意替换为x.x.x.x。

1 个答案:

答案 0 :(得分:2)

您尚未包含所有代码,因此无法确定,但是最可能的解释是您正在某个地方创建Bokeh模型,并在对modify_doc的不同调用之间重用它们。例如,如果您的create_figure函数引用了在函数外部作为全局模块创建的全局ColumnDataSource(或其他任何内容),情况就是这样。这将不起作用,Bokeh模型无法在不同的文档/会话之间重复使用。每次对modify_doc的调用都需要为会话返回一个全新的散景模型集,否则,由于多种原因,不同的用户将共享状态不好的东西(因此明确禁止使用)引发该异常)。