在Heroku上提供交互式Bokeh图形。

11
我正在尝试通过Heroku提供交互式的bokeh图形。我想要提供的图形与此示例(examplecode)基本上是等效的。我对bokeh和heroku都很陌生,所以我相信我可能错过了一些非常基本的东西——我认为我要做的事情应该很简单。
首先,我可以使用“bokeh serve --show myapp”命令在本地服务我的图形。其中,“myapp”是包括bokeh图形的Python模块的名称。请注意,“--show”标志只是提示bokeh在构建图形并运行服务器后打开浏览器窗口。
接下来,我已经创建了一个heroku账户,并且按照Heroku - Python 入门教程中的步骤创建了我的第一个应用程序。我的git存储库包括myapprequirements.txt文件和Procfile
不幸的是,有些东西出了问题,我被难住了。我尝试了很多不同的选项在我的Procfile中,但都没有起作用。由于bokeh serve ...命令会启动一个服务器,那么看起来像这样的Procfile不应该行得通吗:
web: bokeh serve --port $PORT myapp

这段文字的意思是:
“应该可以工作吗?也许我错过了什么,需要创建一个flask应用程序来包装我的bokeh应用程序,但据我所知,这似乎并不必要。也许有人知道一个很好的教程,将所有这些步骤结合在一起,但我还没有找到完整的教程。”
“更新:我粘贴了一部分我的heroku日志。如何处理这个--host whitelist问题?”
2016-07-17T05:00:46.513139+00:00 heroku[slug-compiler]: Slug compilation started
2016-07-17T05:00:46.366909+00:00 heroku[api]: Deploy 9b63d8a by me@me.com
2016-07-17T05:00:46.367087+00:00 heroku[api]: Release v4 created by me@me.com
2016-07-17T05:00:46.624937+00:00 heroku[web.1]: State changed from crashed to starting
2016-07-17T05:00:55.188978+00:00 heroku[web.1]: Starting process with command `bokeh serve --port=39665 myapp.py`
2016-07-17T05:00:57.876287+00:00 app[web.1]: 2016-07-17 05:00:57,876 Starting Bokeh server on port 39665 with applications at paths ['/myapp']
2016-07-17T05:00:57.868758+00:00 app[web.1]: 2016-07-17 05:00:57,868 Starting Bokeh server version 0.12.0
2016-07-17T05:00:57.876378+00:00 app[web.1]: 2016-07-17 05:00:57,876 Starting Bokeh server with process id: 3
2016-07-17T05:00:58.800309+00:00 heroku[web.1]: State changed from starting to up
2016-07-17T05:00:59.970326+00:00 app[web.1]: 2016-07-17 05:00:59,970 Rejected connection from host 'myapp.herokuapp.com' because it is not in the --host whitelist
2016-07-17T05:00:59.973495+00:00 app[web.1]: 2016-07-17 05:00:59,970 403 GET / (XX.XX.XXX.XX) 1.29ms
2016-07-17T05:00:59.975282+00:00 heroku[router]: at=info method=GET path="/" host=myapp.herokuapp.com request_id=xxxxxxxxxxxxx fwd="XX.XX.XX.XX" dyno=web.1 connect=1ms service=4ms status=403 bytes=219
2个回答

9

由于最终我能够让它工作,而且没有其他人回答过这个问题,所以我自己来回答一下。

我最终得到了一个类似于这样的Procfile文件:

web: bokeh serve --port=$PORT --host=myapp.herokuapp.com --host=* \
     --address=0.0.0.0 --use-xheaders myapp.py

以下是关于这些参数的一些背景介绍(据我所知):
--port:指定bokeh服务器监听的端口,$PORT由heroku设置。
--host=myapp.herokuapp.com和--host=*:将主机名指定为myapp.heroku...,通配符允许接受所有主机。我不确定这还是否需要。
--address=0.0.0.0:我认为这告诉bokeh自己找出它将在哪个IP地址上。
--use-xheaders:导致bokeh覆盖远程IP和URI方案/协议。
如果这种方法存在问题,我很乐意对此进行编辑或接受更有经验的用户的答案。

--地址为0.0.0.0的意思是“监听所有网络接口”,可能默认就是这样的。 - Havoc P
--host=* 是一个安全问题,不应该需要使用。这会告诉 Bokeh 信任任何客户端提供的 Host 标头,并将该主机放在其生成的 URL 前面。 - Havoc P
需要使用--use-xheaders参数,这会告诉Bokeh信任由Heroku反向代理设置的“x headers”。这些是Heroku添加的头文件,用于传递有关客户端的信息。 - Havoc P
@HavocP 我尝试通过将Procfile中的内容更改为以下形式来添加另一个Web Worker:web: gunicorn app:app web: bokeh serve --port=$PORT --host=bokehapp.herokuapp.com --host=* --address=0.0.0.0 --use-xheaders bokeh_plot.py。这样可以在bokeh.herokuapp.com/bokeh_plot上显示图表,但无法显示Flask提供的内容。似乎服务器只读取第二行。你有什么想法吗? - multigoodverse
每个 Heroku 应用程序只能有一个 Web 工作进程,如果我没记错的话。因此,您需要两个不同的 Heroku 应用程序,或者一些中间过程来侦听一个端口并根据需要路由到 Bokeh 或 Flask。 - Havoc P
显示剩余5条评论

6

对我来说,原始的最佳答案并不能用(可能是由于 bokeh 版本的差异),但是由于这仍然是该问题的热门结果之一,所以这是我的小修改,它可以工作:

web: bokeh serve --port=$PORT --num-procs=0 --allow-websocket-origin=myapp.herokuapp.com --address=0.0.0.0 --use-xheaders myapp.py

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接