2016-07-25 1 views
2

Мне удалось встроить граф сервера bokeh в Flask. Это выход на локальном хосте:Развертывание на сервере Heroku a Bokeh, встроенное в 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> 

И это то, что я получаю от журналы героику. Заметьте, что есть линия 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, где вызывается сервер bokeh, но мои знания в веб-службах ограничены, поэтому не могу понять, как заставить его работать. Есть идеи?

Редактировать 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" 

Edit 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, что нормально инициировать соединения с веб-сайтами, которые происходят из« где-то еще »(например, кто-то попадает на сервер Bokeh через встроенную веб-страницу, а не переходит непосредственно к Сервер Bokeh). Никто не будет * когда-либо * происходить из 'localhost', так что значение не может быть правильным. Это должно быть общедоступное ip/hostname, с помощью которого пользователи смогут перейти на страницу вашего флеш-приложения. – bigreddot

+0

Возможны другие проблемы, их трудно диагностировать, не видя также журналы сервера Bokeh. – bigreddot

+0

@bigreddot благодарит так много. Я изменил 'localhost: 5000' на' bokehapp.herokuapp.com', который является URL-адресом для приложения. Это избавилось от 'IOError: Can not pull session document'. Он также избавился от внутренней ошибки сервера, которую я получал, я посетил 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

 Смежные вопросы

  • Нет связанных вопросов^_^