2016-07-25 24 views
2

Ich konnte ein Bokeh-Server-Diagramm in Flask einbetten. Dies ist die Ausgabe auf localhost:Bereitstellen auf Heroku ein Bokeh-Server-Plot eingebettet in Flask

enter image description here

Problem ist, ich bin in der Lage, diese Arbeit nicht auf Heroku zu machen. Alles, was ich angezeigt bekomme, ist der Text "Hier ist deine großartige Seite".

Also besteht die App aus drei Dateien.

Es gibt das Skript das Diagramm enthält:

#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" 

die Flasche Skript:

#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) 

Und die index.html Vorlage:

<!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> 

Und das ist, was ich von die Heroku-Protokolle. Beachten Sie, dass dort eine Cannot start Bokeh server, port 5006 is already in use" Linie ist.

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" 

Ich habe verzweifelt nach einer Antwort auf das Web durchsucht, haben aber nichts auf gefunden, wie eine Flasche App bereitstellen, die innerhalb eines Bokeh Server-Anwendung enthält. Also, dieser Beitrag könnte eine gute Ressource sein, wenn jemand in der Lage ist, eine Antwort zu geben.

Ich glaube, der Schlüssel ist in der Unterprozesslinie in der Datei app.py, wo der Bokeh-Server aufgerufen wird, aber mein Wissen in Web-Services ist begrenzt, kann nicht herausfinden, wie es funktioniert. Irgendeine Idee?

Bearbeiten 1: bigreddot vorgeschlagen, den Wert von --allow-websocket-Herkunft auf die URL der App zu ändern. Also änderte ich localhost: 5000 zu bokehapp.herokuapp.com. Das scheint den IOError zu beheben: Sitzungsdokument kann nicht eingefügt werden. Das Diagramm wird jedoch weiterhin nicht angezeigt. Hier sind die neuen Protokolle I von Heroku erhalten:

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" 

Edit 2: Einige noch mehr Protokolle nach dem Passieren --log-level = debug zu Teilprozess:

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

Nun ein Problem ist, dass 'allow-websocket-origin' dem Bokeh-Server mitteilt, dass es in Ordnung ist, Websocket-Verbindungen von" woanders "zu initiieren (zB wenn jemand den Bokeh-Server über eine eingebettete Webseite ansteuert) Bokeh Server). Niemand wird * jemals * von 'localhost' stammen, so dass der Wert nicht stimmen kann. Es sollte der öffentliche ip/hostname sein, mit dem Nutzer navigieren, um Ihre flask-App-Seite zu sehen. – bigreddot

+0

Es kann andere Probleme geben, es ist schwer zu diagnostizieren, ohne auch die Protokolle des Bokeh-Servers zu sehen. – bigreddot

+0

@bigreddot vielen Dank. Ich habe 'localhost: 5000' in' bokehapp.herokuapp.com' geändert, welches die URL für die App ist. Das löste den 'IOError: Session-Dokument kann nicht abgerufen werden'. Es wurde auch der interne Serverfehler beseitigt, den ich bekam, besuchte ich bokehapp.herokuapp.com. Das Diagramm wird jedoch immer noch nicht auf der Webseite angezeigt. Ich bin mir nicht sicher, wo ich die Bokeh-Server-Logs sehen kann. Mir ist nur der Befehl heroku logs bekannt.Ich habe die Frage bearbeitet, um die neuesten Protokolle nach den vorgeschlagenen Änderungen anzuzeigen. Wäre toll, wenn Sie mir zeigen würden, wie man das noch weiter diagnostiziert. – multigoodverse

Antwort

-1

Bitte überprüfen Sie diesen Link http://blog.thedataincubator.com/2015/09/painlessly-deploying-data-apps-with-bokeh-flask-and-heroku/ Der Autor schlug vor, die Bokeh-Komponentenmethode zu verwenden, um ein Skript zu generieren, das in die HTML-Vorlage eingebettet wird. Ich bin mir nicht sicher, ob es immer noch zwei Web-Arbeiter braucht, da ich versuche, meine App auch auf Heroku laufen zu lassen.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – mbomb007