Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Quick demo embedding a Bokeh chart inside a Flask application

This works in a python 3.6 environment with bokeh and flask installed. To use this you need the following directory structure:

 - templates/
   - hello.html

After that you need to open two terminals at app/, in the first one you need to run the bokeh server with the command:

bokeh serve ./ --allow-websocket-origin=

In the second one run the command:


After this the webpage should 'just work' by opening a webpage to http://localhost:5000

''' Present an interactive function explorer with slider widgets.
Scrub the sliders to change the properties of the ``sin`` curve, or
type into the title text box to update the title of the plot.
Use the ``bokeh serve`` command to run the example by executing:
bokeh serve
at your command prompt. Then navigate to the URL
in your browser.
import numpy as np
from import curdoc
from bokeh.layouts import row, widgetbox
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Slider, TextInput
from bokeh.plotting import figure
# Set up data
N = 200
x = np.linspace(0, 4*np.pi, N)
y = np.sin(x)
source = ColumnDataSource(data=dict(x=x, y=y))
# Set up plot
plot = figure(plot_height=400, plot_width=400, title="my sine wave",
x_range=[0, 4*np.pi], y_range=[-2.5, 2.5])
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
# Set up widgets
text = TextInput(title="title", value='my sine wave')
offset = Slider(title="offset", value=0.0, start=-5.0, end=5.0, step=0.1)
amplitude = Slider(title="amplitude", value=1.0, start=-5.0, end=5.0)
phase = Slider(title="phase", value=0.0, start=0.0, end=2*np.pi)
freq = Slider(title="frequency", value=1.0, start=0.1, end=5.1)
# Set up callbacks
def update_title(attrname, old, new):
plot.title.text = text.value
text.on_change('value', update_title)
def update_data(attrname, old, new):
# Get the current slider values
a = amplitude.value
b = offset.value
w = phase.value
k = freq.value
# Generate the new curve
x = np.linspace(0, 4*np.pi, N)
y = a*np.sin(k*x + w) + b = dict(x=x, y=y)
for w in [offset, amplitude, phase, freq]:
w.on_change('value', update_data)
# Set up layouts and add to document
inputs = widgetbox(text, offset, amplitude, phase, freq)
curdoc().add_root(row(inputs, plot, width=800))
curdoc().title = "Sliders"
@import url(;
text-align: center;
font-family: 'Amatic SC', cursive;
font-weight: normal;
color: #8ac640;
font-size: 2.5em;
<p>Flask embedding Bokeh test</p>
{{ bokS|indent(4)|safe }}
from flask import Flask, flash, redirect, render_template, request, session, abort
from bokeh.embed import autoload_server
app = Flask(__name__)
def hello():
return render_template('hello.html',bokS=script)
if __name__ == "__main__":

This comment has been minimized.

Copy link

wamarobert commented Sep 18, 2017

thanks for the help out here. I tried out the code and my socket seems not to be opening with the error below.....

017-09-18 16:37:18,801 Refusing websocket connection from Origin 'http://localhost:5006'; use --allow-websocket-origin=localhost:5006 to permit this; currently we allow origins {''}
2017-09-18 16:37:18,802 403 GET


This comment has been minimized.

Copy link

dmitriidatsenko commented Sep 28, 2017

Thank you. Your script helped me alot.


This comment has been minimized.

Copy link

spyphy commented Mar 6, 2018

$ python3
Traceback (most recent call last):
File "", line 2, in
from bokeh.embed import autoload_server
ImportError: cannot import name 'autoload_server'


This comment has been minimized.

Copy link

coderfever commented Mar 28, 2018

I used Bokeh 0.12.14, which gave me the same 'autoload_server' error. Going through the documentation, I replaced to use "server_document":

from flask import Flask, flash, redirect, render_template, request, session, abort
from bokeh.embed import server_document
# import bokeh
app = Flask(__name__)

def hello():
    # script=server_document(model=None,app_path="/bokeh-sliders",url="http://localhost:5006")
    return render_template('hello.html',bokS=script)

if __name__ == "__main__":
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.