bokeh服务器如何从server_document()

时间:2019-08-08 20:52:56

标签: flask bokeh

我有一个烧瓶应用程序,可与bokeh服务器对话。

我想将参数传递给bokeh服务器,以便bokeh服务器可以使用该信息来不同地显示事物。

这是我的烧瓶路线,以及我尝试将参数传递给bokeh的方式:

@app.route('/test')
def test():
    return render_template(
        'bokeh.html', 
        template='Flask',
        script=server_document(
            url='http://localhost:6001/test',
            arguments={'foo': 'bar'}
    ))

我认为我正确地传递了参数,但是我不知道如何在bokeh服务器上访问这些参数。所以我实际上不知道他们是否能到达那里,但是我看不到任何错误。

我了解到server_document()返回了一个javascript字符串:

<script src="http://localhost:6001/test/autoload.js?bokeh-autoload-element=1001&bokeh-app-path=/test&bokeh-absolute-url=http://localhost:6001/test&foo=bar" id="1001"></script>

因此参数被嵌入到URL http://localhost:6001/test&foo=bar中,但我仍然不知道bokeh服务器如何使它们可用于python代码。

如何在bokeh服务器上访问参数:{'foo': 'bar'}

编辑:

我以为我在Passing arguments to Bokeh autoload_server from Flask api中找到了答案,但是我错了。

当我尝试将建议的内容添加到main.ipynb文件中(我们正在使用面板来提供bokeh应用程序)时,此操作无效:

main.ipynb:
...
print(doc.session_context.request.arguments)
report.serve()

导致此错误:

Error running application handler <bokeh.application.handlers.directory.DirectoryHandler object at 0x7f981b953cf8>: name 'doc' is not defined
File "main.ipynb"...
File "/conda/lib/python3.7/site-packages/bokeh/application/handlers/code_runner.py", line 179...
NameError: name 'doc' is not defined

1 个答案:

答案 0 :(得分:2)

对此内容进行了in the documentation的描述:

# request.arguments is a dict that maps argument names to lists of strings,
# e.g, the query string ?N=10 will result in {'N': [b'10']}

args = curdoc().session_context.request.arguments

try:
  N = int(args.get('N')[0])
except:
  N = 200