Flask Gunicorn Embed Render Problem


I wanted to serve my bokeh application on digital ocean machine. I was successful in serving some plots using bokeh.embed.components. This example was just for standalone documents though. Now I would like to embed an entire bokeh application to flask. When I followed the code, here https://github.com/bokeh/bokeh/blob/1.0.2/examples/howto/server_embed/flask_gunicorn_embed.py , the plots are not rendered. Could you please help me figure out the problem I am facing? I am using Nginx and Gunicorn on same digital ocean machine by the way. You can find the config files for Nginx and Gunicorn and the code below.

Thanks in advance.


Description=Gunicorn instance to serve myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app



server {

listen 80;

server_name server_domain_or_IP;

location / {

include proxy_params;

proxy_pass http://unix:/home/sammy/myproject/myproject.sock;



import asyncio
except ImportError:
raise RuntimeError(“This example requries Python3 / asyncio”)
from flask import Flask, render_template
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from bokeh.application import Application
from bokeh.application.handlers import FunctionHandler
from bokeh.embed import server_document
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
from bokeh.server.server import BaseServer
from bokeh.server.tornado import BokehTornado
from bokeh.server.util import bind_sockets
from bokeh.themes import Theme
if name == ‘main’:
print(‘This script is intended to be run with gunicorn. e.g.’)
print(’ gunicorn -w 4 flask_gunicorn_embed:app’)
print(‘will start the app on four processes’)
import sys
from bokeh.sampledata.sea_surface_temperature import sea_surface_temperature
app = Flask(name)
def modify_doc(doc):
df = sea_surface_temperature.copy()
source = ColumnDataSource(data=df)
plot = figure(x_axis_type=‘datetime’, y_range=(0, 25), y_axis_label=‘Temperature (Celsius)’,
title=“Sea Surface Temperature at 43.18, -70.43”)
plot.line(‘time’, ‘temperature’, source=source)
def callback(attr, old, new):
if new == 0:
data = df
data = df.rolling(’{0}D’.format(new)).mean()
source.data = ColumnDataSource(data=data).data
slider = Slider(start=0, end=30, value=0, step=1, title=“Smoothing by N Days”)
slider.on_change(‘value’, callback)
doc.add_root(column(slider, plot))
doc.theme = Theme(filename=“theme.yaml”)

can’t use shortcuts here, since we are passing to low level BokehTornado

bkapp = Application(FunctionHandler(modify_doc))

This is so that if this app is run using something like “gunicorn -w 4” then

each process will listen on its own port

sockets, port = bind_sockets(“localhost”, 0)
@app.route(’/’, methods=[‘GET’])
def bkapp_page():
script = server_document(‘http://localhost:%d/bkapp’ % port)
return render_template(“embed.html”, script=script, template=“Flask”)
def bk_worker():
bokeh_tornado = BokehTornado({’/bkapp’: bkapp}, extra_websocket_origins=[“localhost:8000”])
bokeh_http = HTTPServer(bokeh_tornado)
server = BaseServer(IOLoop.current(), bokeh_tornado, bokeh_http)
from threading import Thread