2016-07-25 66 views
2

我能夠在Flask中嵌入散景服務器圖。這是在本地主機上輸出:在Heroku中部署一個嵌入到Flask中的散景服務器圖

enter image description here

問題是我不能夠使在Heroku這項工作。我所顯示的只是文字「這是你的偉大網站」。

因此,該應用程序由三個文件組成。

還有一個包含圖形腳本:

#bokeh_plot.py 
import pandas as pd 

from bokeh.layouts import row, widgetbox 
from bokeh.models import Select 
from bokeh.palettes import Spectral5 
from bokeh.plotting import curdoc, figure 
from bokeh.sampledata.autompg import autompg 

df = autompg.copy() 

SIZES = list(range(6, 22, 3)) 
COLORS = Spectral5 
ORIGINS = ['North America', 'Europe', 'Asia'] 

# data cleanup 
df.cyl = [str(x) for x in df.cyl] 
df.origin = [ORIGINS[x-1] for x in df.origin] 

df['year'] = [str(x) for x in df.yr] 
del df['yr'] 

df['mfr'] = [x.split()[0] for x in df.name] 
df.loc[df.mfr=='chevy', 'mfr'] = 'chevrolet' 
df.loc[df.mfr=='chevroelt', 'mfr'] = 'chevrolet' 
df.loc[df.mfr=='maxda', 'mfr'] = 'mazda' 
df.loc[df.mfr=='mercedes-benz', 'mfr'] = 'mercedes' 
df.loc[df.mfr=='toyouta', 'mfr'] = 'toyota' 
df.loc[df.mfr=='vokswagen', 'mfr'] = 'volkswagen' 
df.loc[df.mfr=='vw', 'mfr'] = 'volkswagen' 
del df['name'] 

columns = sorted(df.columns) 
discrete = [x for x in columns if df[x].dtype == object] 
continuous = [x for x in columns if x not in discrete] 
quantileable = [x for x in continuous if len(df[x].unique()) > 20] 


def create_figure(): 
    xs = df[x.value].values 
    ys = df[y.value].values 
    x_title = x.value.title() 
    y_title = y.value.title() 

    kw = dict() 
    if x.value in discrete: 
     kw['x_range'] = sorted(set(xs)) 
    if y.value in discrete: 
     kw['y_range'] = sorted(set(ys)) 
    kw['title'] = "%s vs %s" % (x_title, y_title) 

    p = figure(plot_height=600, plot_width=800, tools='pan,box_zoom,reset', **kw) 
    p.xaxis.axis_label = x_title 
    p.yaxis.axis_label = y_title 

    if x.value in discrete: 
     p.xaxis.major_label_orientation = pd.np.pi/4 

    sz = 9 
    if size.value != 'None': 
     groups = pd.qcut(df[size.value].values, len(SIZES)) 
     sz = [SIZES[xx] for xx in groups.codes] 

    c = "#31AADE" 
    if color.value != 'None': 
     groups = pd.qcut(df[color.value].values, len(COLORS)) 
     c = [COLORS[xx] for xx in groups.codes] 
    p.circle(x=xs, y=ys, color=c, size=sz, line_color="white", alpha=0.6, hover_color='white', hover_alpha=0.5) 

    return p 


def update(attr, old, new): 
    layout.children[1] = create_figure() 


x = Select(title='X-Axis', value='mpg', options=columns) 
x.on_change('value', update) 

y = Select(title='Y-Axis', value='hp', options=columns) 
y.on_change('value', update) 

size = Select(title='Size', value='None', options=['None'] + quantileable) 
size.on_change('value', update) 

color = Select(title='Color', value='None', options=['None'] + quantileable) 
color.on_change('value', update) 

controls = widgetbox([x, y, color, size], width=200) 
layout = row(controls, create_figure()) 

curdoc().add_root(layout) 
curdoc().title = "Crossfilter" 

燒瓶腳本:

#app.py 
import subprocess 
import atexit 
from flask import render_template, render_template_string, Flask 
from bokeh.embed import autoload_server 
from bokeh.client import pull_session 

app = Flask(__name__) 

bokeh_process = subprocess.Popen(
    ['bokeh', 'serve','--allow-websocket-origin=localhost:5000','bokeh_plot.py'], stdout=subprocess.PIPE) 

@atexit.register 
def kill_server(): 
    bokeh_process.kill() 

@app.route("/") 
def index(): 
    session=pull_session(app_path="/bokeh_plot") 
    bokeh_script=autoload_server(None,app_path="/bokeh_plot",session_id=session.id) 
    return render_template("index.html", bokeh_script=bokeh_script) 

if __name__ == "__main__": 
    print("STARTED") 
    app.run(debug=True) 

而且index.html的模板:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <style> 
      @import url(https://fonts.googleapis.com/css?family=Noto+Sans); 
      body { 
       font-family: 'Noto Sans', sans-serif; 
       -webkit-font-smoothing: antialiased; 
       text-rendering: optimizeLegibility; 
       color: #fff; 
       background: #2F2F2F; 
      } 
     </style> 
     <meta charset="utf-8"> 
     <title>Bokeh Crossfilter Example</title> 
    </head> 
    <body> 
     <p> This is your great site<p> 
     <div class="bk-root"> 
     {{ bokeh_script|safe }} 
     </div> 
    </body> 
</html> 

這是我從獲得heroku日誌。請注意,那裏有一條Cannot start Bokeh server, port 5006 is already in use"線路。

heroku[web.1]: State changed from down to starting 
heroku[web.1]: Unidling 
heroku[web.1]: Starting process with command `gunicorn app:app` 
app[web.1]: [2016-07-25 09:32:40 +0000] [3] [INFO] Starting gunicorn 19.6.0 
app[web.1]: [2016-07-25 09:32:40 +0000] [3] [INFO] Listening at: http://0.0.0.0:48905 (3) 
app[web.1]: [2016-07-25 09:32:40 +0000] [3] [INFO] Using worker: sync 
app[web.1]: [2016-07-25 09:32:40 +0000] [7] [INFO] Booting worker with pid: 7 
app[web.1]: [2016-07-25 09:32:40 +0000] [8] [INFO] Booting worker with pid: 8 
heroku[web.1]: State changed from starting to up 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1641, in full_dispatch_request" 
app[web.1]: Traceback (most recent call last): 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1988, in wsgi_app" 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1544, in handle_user_exception" 
app[web.1]:  rv = self.handle_user_exception(e) 
"app[web.1]: [2016-07-25 09:32:44,050] ERROR in app: Exception on/[GET]" 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/_compat.py"", line 33, in reraise" 
app[web.1]:  response = self.full_dispatch_request() 
"app[web.1]:  reraise(exc_type, exc_value, tb)" 
app[web.1]:  raise value 
"app[web.1]: OSError: Cannot pull session document because we failed to connect to the server (to start the server, try the 'bokeh serve' command)" 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1639, in full_dispatch_request" 
app[web.1]:  rv = self.dispatch_request() 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1625, in dispatch_request" 
app[web.1]:  return self.view_functions[rule.endpoint](**req.view_args) 
"app[web.1]: File ""/app/app.py"", line 37, in index" 
"app[web.1]:  session=pull_session(app_path=""/bokeh_plot"")" 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/bokeh/client/session.py"", line 112, in pull_session" 
app[web.1]:  session.pull() 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/bokeh/client/session.py"", line 231, in pull" 
app[web.1]:  rv = self.handle_user_exception(e) 
"app[web.1]:  raise IOError(""Cannot pull session document because we failed to connect to the server (to start the server, try the 'bokeh serve' command)"")" 
app[web.1]: ERROR:app:Exception on/[GET] 
app[web.1]: Traceback (most recent call last): 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1988, in wsgi_app" 
app[web.1]:  response = self.full_dispatch_request() 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1641, in full_dispatch_request" 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/_compat.py"", line 33, in reraise" 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1625, in dispatch_request" 
app[web.1]:  raise value 
app[web.1]:  rv = self.dispatch_request() 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1639, in full_dispatch_request" 
app[web.1]:  return self.view_functions[rule.endpoint](**req.view_args) 
"app[web.1]: File ""/app/app.py"", line 37, in index" 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/flask/app.py"", line 1544, in handle_user_exception" 
"app[web.1]:  reraise(exc_type, exc_value, tb)" 
"app[web.1]:  session=pull_session(app_path=""/bokeh_plot"")" 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/bokeh/client/session.py"", line 112, in pull_session" 
app[web.1]:  session.pull() 
"app[web.1]: File ""/app/.heroku/python/lib/python3.5/site-packages/bokeh/client/session.py"", line 231, in pull" 
"app[web.1]:  raise IOError(""Cannot pull session document because we failed to connect to the server (to start the server, try the 'bokeh serve' command)"")" 
"app[web.1]: OSError: Cannot pull session document because we failed to connect to the server (to start the server, try the 'bokeh serve' command)" 
"heroku[router]: at=info method=GET path=""/"" host=bokehapp.herokuapp.com request_id=f60be826-3fba-4eab-b18f-aa0eb822ebdd fwd=""217.73.139.64"" dyno=web.1 connect=2ms service=77ms status=500 bytes=456" 
"app[web.1]: 2016-07-25 09:32:44,637 Starting Bokeh server on port 5006 with applications at paths ['/bokeh_plot']" 
**"app[web.1]: 2016-07-25 09:32:44,683 Cannot start Bokeh server, port 5006 is already in use"** 
"app[web.1]: 2016-07-25 09:32:44,681 Starting Bokeh server version 0.12.0" 
"app[web.1]: 2016-07-25 09:32:44,637 Starting Bokeh server with process id: 26" 
"app[web.1]: 2016-07-25 09:32:44,620 Starting Bokeh server version 0.12.0" 
"app[web.1]: 2016-07-25 09:32:55,074 WebSocket connection opened" 
"app[web.1]: 2016-07-25 09:32:55,187 ServerConnection created" 
"heroku[router]: at=info method=GET path=""/"" host=bokehapp.herokuapp.com request_id=41493fd5-aed9-4198-b063-652f93cee49e fwd=""217.73.139.64"" dyno=web.1 connect=0ms service=550ms status=200 bytes=1066" 

我都拼命搜索在網絡上的答案,但還沒有找到如何部署內部包含一個背景虛化的服務器應用程序的燒瓶中應用什麼。所以,如果有人能夠提供答案,這篇文章可能是一個很好的資源。

我相信關鍵在於app.py文件中的subprocess行中調用了散景服務器,但是我在web服務方面的知識有限,所以無法弄清楚如何使其工作。任何想法?

編輯1:bigreddot建議將--allow-websocket-origin的值更改爲應用程序的url。所以,我確實將localhost:5000更改爲bokehapp.herokuapp.com。這似乎解決了IOError:無法放置會話文檔。但是,圖表仍然不顯示。下面是新日誌,我從Heroku的獲得:

heroku[slug-compiler]: Slug compilation finished 
heroku[slug-compiler]: Slug compilation started 
heroku[web.1]: State changed from down to starting 
heroku[web.1]: Starting process with command `gunicorn app:app` 
app[web.1]: [2016-07-25 15:02:50 +0000] [3] [INFO] Using worker: sync 
app[web.1]: [2016-07-25 15:02:50 +0000] [7] [INFO] Booting worker with pid: 7 
app[web.1]: [2016-07-25 15:02:50 +0000] [3] [INFO] Starting gunicorn 19.6.0 
app[web.1]: [2016-07-25 15:02:50 +0000] [3] [INFO] Listening at: http://0.0.0.0:23620 (3) 
app[web.1]: [2016-07-25 15:02:50 +0000] [8] [INFO] Booting worker with pid: 8 
heroku[api]: Release v7 created by [email protected] 
heroku[api]: Deploy be12fcc by [email protected] 
heroku[web.1]: State changed from starting to up 
"app[web.1]: 2016-07-25 15:02:55,278 Starting Bokeh server with process id: 25" 
"app[web.1]: 2016-07-25 15:02:55,261 Starting Bokeh server version 0.12.0" 
"app[web.1]: 2016-07-25 15:02:55,276 Starting Bokeh server version 0.12.0" 
"app[web.1]: 2016-07-25 15:02:55,284 Cannot start Bokeh server, port 5006 is already in use" 
"app[web.1]: 2016-07-25 15:02:55,278 Starting Bokeh server on port 5006 with applications at paths ['/bokeh_plot']" 
"app[web.1]: 2016-07-25 15:03:14,375 WebSocket connection opened" 
"app[web.1]: 2016-07-25 15:03:15,029 ServerConnection created" 
"heroku[router]: at=info method=GET path=""/"" host=bokehapp.herokuapp.com request_id=5e7a06ad-4526-4304-b00e-0c37979ab751 fwd=""109.236.33.234"" dyno=web.1 connect=1ms service=3778ms status=200 bytes=1066" 
"app[web.1]: 2016-07-25 15:03:59,253 ServerConnection created" 
"app[web.1]: 2016-07-25 15:03:59,133 WebSocket connection opened" 

編輯2:通過--log級=調試後,有些人甚至更多的日誌子過程:

heroku[slug-compiler]: Slug compilation started 
heroku[slug-compiler]: Slug compilation finished 
heroku[api]: Deploy 9c2fefa by [email protected] 
heroku[api]: Release v12 created by [email protected] 
heroku[web.1]: Restarting 
heroku[web.1]: State changed from up to starting 
heroku[web.1]: Stopping all processes with SIGTERM 
app[web.1]: [2016-07-25 21:53:37 +0000] [3] [INFO] Handling signal: term 
app[web.1]: [2016-07-25 21:53:37 +0000] [7] [INFO] Worker exiting (pid: 7) 
app[web.1]: [2016-07-25 21:53:38 +0000] [3] [INFO] Shutting down: Master 
app[web.1]: [2016-07-25 21:53:37 +0000] [8] [INFO] Worker exiting (pid: 8) 
heroku[web.1]: Process exited with status 0 
heroku[web.1]: Starting process with command `gunicorn app:app` 
app[web.1]: [2016-07-25 21:53:53 +0000] [3] [INFO] Starting gunicorn 19.6.0 
app[web.1]: [2016-07-25 21:53:53 +0000] [3] [INFO] Using worker: sync 
app[web.1]: [2016-07-25 21:53:53 +0000] [8] [INFO] Booting worker with pid: 8 
app[web.1]: [2016-07-25 21:53:53 +0000] [7] [INFO] Booting worker with pid: 7 
app[web.1]: [2016-07-25 21:53:53 +0000] [3] [INFO] Listening at: http://0.0.0.0:41934 (3) 
heroku[web.1]: State changed from starting to up 
"app[web.1]: 2016-07-25 21:53:58,821 Allowed Host headers: ['localhost:5006']" 
"app[web.1]: 2016-07-25 21:53:58,821 These host origins can connect to the websocket: ['bokehapp.herokuapp.com:80', 'localhost:5006']" 
"app[web.1]: 2016-07-25 21:53:58,821 Patterns are:" 
"app[web.1]: 2016-07-25 21:53:58,821 Starting Bokeh server version 0.12.0" 
"app[web.1]: 2016-07-25 21:53:58,823  {'application_context': <bokeh.server.application_context.ApplicationContext object at 0x7f7bf7dd51d0>," 
"app[web.1]: 2016-07-25 21:53:58,832  <class 'bokeh.server.views.ws.WSHandler'>," 
"app[web.1]: 2016-07-25 21:53:58,832 ('/bokeh_plot/autoload.js'," 
"app[web.1]: 2016-07-25 21:53:58,831 ('/bokeh_plot/ws'," 
"app[web.1]: 2016-07-25 21:53:58,832  <class 'bokeh.server.views.autoload_js_handler.AutoloadJsHandler'>," 
"app[web.1]: 2016-07-25 21:53:58,832  {'application_context': <bokeh.server.application_context.ApplicationContext object at 0x7f7bf7dd51d0>," 
"app[web.1]: 2016-07-25 21:53:58,832  'bokeh_websocket_path': '/bokeh_plot/ws'})," 
"app[web.1]: 2016-07-25 21:53:58,833  {'applications': {'/bokeh_plot': <bokeh.server.application_context.ApplicationContext object at 0x7f7bf7dd51d0>}," 
"app[web.1]: 2016-07-25 21:53:58,823 [('/bokeh_plot/?'," 
"app[web.1]: 2016-07-25 21:53:58,823  <class 'bokeh.server.views.doc_handler.DocHandler'>," 
"app[web.1]: 2016-07-25 21:53:58,823  'bokeh_websocket_path': '/bokeh_plot/ws'})," 
"app[web.1]: 2016-07-25 21:53:58,832  {'application_context': <bokeh.server.application_context.ApplicationContext object at 0x7f7bf7dd51d0>," 
"app[web.1]: 2016-07-25 21:53:58,833  'prefix': ''," 
"app[web.1]: 2016-07-25 21:53:58,833  'use_redirect': True})," 
"app[web.1]: 2016-07-25 21:53:58,833 ('/static/(.*)'," 
"app[web.1]: 2016-07-25 21:53:58,833  <class 'bokeh.server.views.static_handler.StaticHandler'>)]" 
"app[web.1]: 2016-07-25 21:53:58,832  'bokeh_websocket_path': '/bokeh_plot/ws'})," 
"app[web.1]: 2016-07-25 21:53:58,861 Starting Bokeh server on port 5006 with applications at paths ['/bokeh_plot']" 
"app[web.1]: 2016-07-25 21:53:58,832 ('/?'," 
"app[web.1]: 2016-07-25 21:53:58,833  <class 'bokeh.server.views.root_handler.RootHandler'>," 
"app[web.1]: 2016-07-25 21:53:58,896 These host origins can connect to the websocket: ['bokehapp.herokuapp.com:80', 'localhost:5006']" 
"app[web.1]: 2016-07-25 21:53:58,898 [('/bokeh_plot/?'," 
"app[web.1]: 2016-07-25 21:53:58,899  {'application_context': <bokeh.server.application_context.ApplicationContext object at 0x7f8a84cb4b70>," 
"app[web.1]: 2016-07-25 21:53:58,896 Starting Bokeh server version 0.12.0" 
"app[web.1]: 2016-07-25 21:53:58,897 Patterns are:" 
"app[web.1]: 2016-07-25 21:53:58,899  <class 'bokeh.server.views.doc_handler.DocHandler'>," 
"app[web.1]: 2016-07-25 21:53:58,896 Allowed Host headers: ['localhost:5006']" 
"app[web.1]: 2016-07-25 21:53:58,900  <class 'bokeh.server.views.autoload_js_handler.AutoloadJsHandler'>," 
"app[web.1]: 2016-07-25 21:53:58,899 ('/bokeh_plot/ws'," 
"app[web.1]: 2016-07-25 21:53:58,899  <class 'bokeh.server.views.ws.WSHandler'>," 
"app[web.1]: 2016-07-25 21:53:58,899  'bokeh_websocket_path': '/bokeh_plot/ws'})," 
"app[web.1]: 2016-07-25 21:53:58,899  {'application_context': <bokeh.server.application_context.ApplicationContext object at 0x7f8a84cb4b70>," 
"app[web.1]: 2016-07-25 21:53:58,900  'bokeh_websocket_path': '/bokeh_plot/ws'})," 
"app[web.1]: 2016-07-25 21:53:58,900 ('/bokeh_plot/autoload.js'," 
"app[web.1]: 2016-07-25 21:53:58,861 Starting Bokeh server with process id: 25" 
"app[web.1]: 2016-07-25 21:53:58,900  {'application_context': <bokeh.server.application_context.ApplicationContext object at 0x7f8a84cb4b70>," 
"app[web.1]: 2016-07-25 21:53:58,900  'bokeh_websocket_path': '/bokeh_plot/ws'})," 
"app[web.1]: 2016-07-25 21:53:58,901  'use_redirect': True})," 
"app[web.1]: 2016-07-25 21:53:58,900 ('/?'," 
"app[web.1]: 2016-07-25 21:53:58,901 ('/static/(.*)'," 
"app[web.1]: 2016-07-25 21:53:58,901  <class 'bokeh.server.views.static_handler.StaticHandler'>)]" 
"app[web.1]: 2016-07-25 21:53:58,904 Cannot start Bokeh server, port 5006 is already in use" 
"app[web.1]: 2016-07-25 21:53:58,900  <class 'bokeh.server.views.root_handler.RootHandler'>," 
"app[web.1]: 2016-07-25 21:53:58,901  {'applications': {'/bokeh_plot': <bokeh.server.application_context.ApplicationContext object at 0x7f8a84cb4b70>}," 
"app[web.1]: 2016-07-25 21:53:58,901  'prefix': ''," 
"app[web.1]: 2016-07-25 21:54:13,880 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:54:13,880 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:54:43,870 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:54:43,869 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:54:58,870 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:54:58,869 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:55:13,862 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:55:13,862 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:55:28,864 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:55:28,863 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:55:43,864 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:55:43,865 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:55:58,862 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:55:58,862 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:56:13,876 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:56:13,877 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:56:28,864 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:56:28,865 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:56:43,875 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:56:43,876 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:56:58,872 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:56:58,872 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:57:13,863 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:57:13,862 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:57:28,872 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:57:28,872 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:57:43,868 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:57:43,867 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:57:58,863 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:57:58,864 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:58:13,879 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:58:13,880 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:58:28,873 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:58:28,874 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:58:43,872 [pid 25] /bokeh_plot has 0 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:58:43,871 [pid 25] 0 clients connected" 
"app[web.1]: 2016-07-25 21:58:49,718 WebSocket connection opened" 
"app[web.1]: 2016-07-25 21:58:50,223 Sending pull-doc-reply from session 'Q4LGpWidke5G85sboBiRPMazzPfwOwTDMirNrDsTY3OL'" 
"app[web.1]: 2016-07-25 21:58:50,177 Receiver created for Protocol('1.0')" 
"app[web.1]: 2016-07-25 21:58:50,178 ServerHandler created for Protocol('1.0')" 
"app[web.1]: 2016-07-25 21:58:50,178 ServerConnection created" 
"heroku[router]: at=info method=GET path=""/"" host=bokehapp.herokuapp.com request_id=15fc6908-1031-4d88-86cc-8048d6195a6f fwd=""109.236.47.207"" dyno=web.1 connect=1ms service=1341ms status=200 bytes=1066" 
"app[web.1]: 2016-07-25 21:58:58,864 [pid 25] /bokeh_plot has 1 sessions with 0 unused" 
"app[web.1]: 2016-07-25 21:58:58,863 [pid 25] 1 clients connected" 
+0

那麼一個問題是'allow-websocket-origin'告訴Bokeh服務器可以啓動來自「其他地方」的websocket連接(例如,某人通過嵌入式網頁訪問Bokeh服務器,而不是直接導航到散景服務器)。沒有人會從'localhost'發起任何事情,因此價值不可能是正確的。它應該是公共ip /主機名,人們將導航到看到你的燒瓶應用程序頁面。 – bigreddot

+0

可能還有其他問題,如果沒有看到Bokeh服務器日誌,也很難診斷。 – bigreddot

+0

@bigreddot非常感謝。我將'localhost:5000'更改爲'bokehapp.herokuapp.com',這是該應用的網址。這擺脫了'IOError:無法拉會議文件'。它也擺脫了我訪問bokehapp.herokuapp.com時發生的內部服務器錯誤。但是,該圖表仍未在網頁上顯示。我不確定在哪裏可以看到Bokeh服務器日誌。我只知道heroku日誌命令。我編輯了問題,以便在提出更改後顯示最新日誌。如果你向我展示如何進一步診斷,這將會很棒。 – multigoodverse

回答

-1

請檢查該鏈接http://blog.thedataincubator.com/2015/09/painlessly-deploying-data-apps-with-bokeh-flask-and-heroku/作者建議使用Bokeh組件方法生成將嵌入到.html模板中的腳本。不知道它是否仍然需要兩名網絡工作者,因爲我正試圖讓我的應用程序在Heroku上工作。

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – mbomb007