在 Flask 中调制 Bokeh 服务器

Posted

技术标签:

【中文标题】在 Flask 中调制 Bokeh 服务器【英文标题】:Modulating Bokeh Servers within Flask 【发布时间】:2018-10-19 18:39:18 【问题描述】:

我在一个目录中有许多 Bokeh Server 文件,比如 /dir/bokeh/,假设 bokeh 服务器被称为 bokeh1.py, bokeh2.py, bokeh3.py

文件结构如下:

|--dir
    |---flask.py
    |---bokeh
          |--bokeh1.py
          |--bokeh2.py

我将它们全部部署在烧瓶上,如下所示:

files=[]
for file in os.listdir("/dir/bokeh/"):
    if file.endswith('.py'):
        file="bokeh/"+file
        files.append(file)

argvs = 
urls = []
for i in files:
    argvs[i] = None
    urls.append(i.split('\\')[-1].split('.')[0])
host = 'myhost.com'

apps = build_single_handler_applications(files, argvs)

bokeh_tornado = BokehTornado(apps, extra_websocket_origins=["myhost.com"])
bokeh_http = HTTPServer(bokeh_tornado)
sockets, port = bind_sockets("myhost.com", 0)
bokeh_http.add_sockets(sockets)

然后对于每个散景服务器,我在flask.py 内:

@app.route("/bokeh1")
    def bokeh1():
    bokeh_script = server_document("http://11.111.11.111:%d/bokeh1" % port) 
    return render_template("bokserv.html", bokeh_script=bokeh_script)

我需要部署的散景服务器数量可能会快速增长。如何根据我当前的设置有效地为每个散景bokeh1.py, bokeh2.py, bokeh3.py 生成@app.route?服务器正在 Ubuntu 上运行

【问题讨论】:

【参考方案1】:

您可以在一个循环中创建所有函数:

def serve(name):
    @app.route("/".format(name))
    def func():
        bokeh_script = server_document("http://11.111.11.111:%d/%s" % (port, name))
        return render_template("bokserv.html", bokeh_script=bokeh_script)

    func.__name__ = name
    return func

all_serve_functions = [serve(name) for name in all_names]

【讨论】:

由于某种原因,它正在返回,`视图函数映射正在覆盖现有的端点函数:func`。这可能是什么原因造成的? 新发现。您必须在app.route 行上设置endpoint 参数。为了安全起见,请确保 name 不包含扩展名 .py

以上是关于在 Flask 中调制 Bokeh 服务器的主要内容,如果未能解决你的问题,请参考以下文章

无法将散景图嵌入到 Flask 应用程序中

在bokeh中嵌入散景应用程序

使用 Python 的 Bokeh 和 Folium 模块创建的仪表板/地图是不是安全?数据是不是上传到任何外部服务器?

带有 AjaxDataSource 的 Bokeh DataTable 未获取或更新

带有 `import bokeh` 的烧瓶,带有 2 个没有外部散景服务器的散景图,而不是“模型只能由一个文档拥有”

散景内联嵌入,“加载资源失败”