在 heroku 上提供交互式散景图
Serving interactive bokeh figure on heroku
我正在尝试通过 heroku 提供交互式 bokeh
图形。我尝试提供的数字基本上等同于这个 (example, code)。我对 bokeh
和 heroku
都是新手,所以我很确定我遗漏了一些非常基本的东西——我认为我想做的事情应该非常简单。
首先,我可以使用 bokeh serve --show myapp
命令在本地提供我的图形。其中 myapp
是包含 bokeh
图的 python 模块的名称。请注意,--show
标志只是提示 bokeh
打开浏览器 window 一旦构建了图形并且服务器是 运行.
接下来,我设置了一个 heroku
帐户,并按照 Heroku - Getting Started With Python tutorial 中的步骤创建了我的第一个应用程序。我的 git 存储库包括 myapp
、一个 requirements.txt
文件和 Procfile
.
唉,有些东西不起作用,我很难过。我在 Procfile
中尝试了很多不同的选项,并且 none 都有效。由于 bokeh serve ...
命令启动了一个服务器,看起来像这样的 Procfile
不应该起作用吗:
web: bokeh serve --port $PORT myapp
应该行吗?也许我遗漏了一些东西,我需要创建一个环绕我的 bokeh
应用程序的 flask
应用程序,但据我所知,这似乎没有必要。也许有人知道一个很好的教程,可以将所有这些步骤整合在一起,但我还没有找到完整的教程。
更新:
我在下面粘贴了一些 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
我只想回答我自己的问题,因为我最终能够让它工作,但还没有其他人回答过它。
我最终得到了一个 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 scheme/protocol
如果此方法存在问题,我很乐意对此进行编辑或接受更有见识的用户回答。
接受的答案并不像我写的那样有效(可能是由于散景版本的差异),但由于这仍然是这个问题的热门答案之一,这里是我的小修改,确实有效:
web: bokeh serve --port=$PORT --num-procs=0 --allow-websocket-origin=myapp.herokuapp.com --address=0.0.0.0 --use-xheaders myapp.py
我正在尝试通过 heroku 提供交互式 bokeh
图形。我尝试提供的数字基本上等同于这个 (example, code)。我对 bokeh
和 heroku
都是新手,所以我很确定我遗漏了一些非常基本的东西——我认为我想做的事情应该非常简单。
首先,我可以使用 bokeh serve --show myapp
命令在本地提供我的图形。其中 myapp
是包含 bokeh
图的 python 模块的名称。请注意,--show
标志只是提示 bokeh
打开浏览器 window 一旦构建了图形并且服务器是 运行.
接下来,我设置了一个 heroku
帐户,并按照 Heroku - Getting Started With Python tutorial 中的步骤创建了我的第一个应用程序。我的 git 存储库包括 myapp
、一个 requirements.txt
文件和 Procfile
.
唉,有些东西不起作用,我很难过。我在 Procfile
中尝试了很多不同的选项,并且 none 都有效。由于 bokeh serve ...
命令启动了一个服务器,看起来像这样的 Procfile
不应该起作用吗:
web: bokeh serve --port $PORT myapp
应该行吗?也许我遗漏了一些东西,我需要创建一个环绕我的 bokeh
应用程序的 flask
应用程序,但据我所知,这似乎没有必要。也许有人知道一个很好的教程,可以将所有这些步骤整合在一起,但我还没有找到完整的教程。
更新:
我在下面粘贴了一些 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
我只想回答我自己的问题,因为我最终能够让它工作,但还没有其他人回答过它。
我最终得到了一个 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 scheme/protocol
如果此方法存在问题,我很乐意对此进行编辑或接受更有见识的用户回答。
接受的答案并不像我写的那样有效(可能是由于散景版本的差异),但由于这仍然是这个问题的热门答案之一,这里是我的小修改,确实有效:
web: bokeh serve --port=$PORT --num-procs=0 --allow-websocket-origin=myapp.herokuapp.com --address=0.0.0.0 --use-xheaders myapp.py