Here are the examples of the python api bokeh.application.Application taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
73 Examples
3
View Source File : routing.py
License : BSD 3-Clause "New" or "Revised" License
Project Creator : holzschu
License : BSD 3-Clause "New" or "Revised" License
Project Creator : holzschu
def _normalize(self, obj: ApplicationLike) -> Application:
if callable(obj):
return Application(FunctionHandler(obj))
elif isinstance(obj, Path):
return build_single_handler_application(obj)
else:
return obj
def _fixup(self, app: Application) -> Application:
3
View Source File : test_contexts.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_create_session_if_needed_new(self):
app = Application()
c = bsc.ApplicationContext(app, io_loop="ioloop")
class FakeRequest(object):
arguments = dict(foo=10)
req = FakeRequest()
s = c.create_session_if_needed("foo", request=req)
assert c.get_session("foo") == s.result()
def test_create_session_if_needed_exists(self):
3
View Source File : test_contexts.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_create_session_if_needed_exists(self):
app = Application()
c = bsc.ApplicationContext(app, io_loop="ioloop")
class FakeRequest(object):
arguments = dict(foo=10)
req = FakeRequest()
s1 = c.create_session_if_needed("foo", request=req)
s2 = c.create_session_if_needed("foo", request=req)
assert s1.result() == s2.result()
def test_create_session_if_needed_bad_sessionid(self):
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_prefix():
application = Application()
with ManagedServerLoop(application) as server:
assert server.prefix == ""
with ManagedServerLoop(application, prefix="foo") as server:
assert server.prefix == "foo"
def test_index():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_index():
application = Application()
with ManagedServerLoop(application) as server:
assert server.index is None
with ManagedServerLoop(application, index="foo") as server:
assert server.index == "foo"
def test_get_sessions():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_use_xheaders():
application = Application()
with ManagedServerLoop(application, use_xheaders=True) as server:
assert server._http.xheaders == True
# This test just maintains basic creation and setup, detailed functionality
# is exercised by Server tests above
def test_base_server():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_base_server():
app = BokehTornado(Application())
httpserver = HTTPServer(app)
httpserver.start()
loop = IOLoop()
loop.make_current()
server = BaseServer(loop, app, httpserver)
server.start()
assert server.io_loop == loop
assert server._tornado.io_loop == loop
httpserver.stop()
server.stop()
server.io_loop.close()
def test_server_applications_callable_arg():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__request_in_session_context():
application = Application()
with ManagedServerLoop(application) as server:
response = http_get(server.io_loop,
url(server) + "?foo=10")
html = response.body
sessionid = extract_sessionid_from_json(html)
server_session = server.get_session('/', sessionid)
server_doc = server_session.document
session_context = server_doc.session_context
# do we have a request
assert session_context.request is not None
def test__request_in_session_context_has_arguments():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__request_in_session_context_has_arguments():
application = Application()
with ManagedServerLoop(application) as server:
response = http_get(server.io_loop,
url(server) + "?foo=10")
html = response.body
sessionid = extract_sessionid_from_json(html)
server_session = server.get_session('/', sessionid)
server_doc = server_session.document
session_context = server_doc.session_context
# test if we can get the argument from the request
assert session_context.request.arguments['foo'] == [b'10']
def test__no_request_arguments_in_session_context():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__no_request_arguments_in_session_context():
application = Application()
with ManagedServerLoop(application) as server:
response = http_get(server.io_loop,
url(server))
html = response.body
sessionid = extract_sessionid_from_json(html)
server_session = server.get_session('/', sessionid)
server_doc = server_session.document
session_context = server_doc.session_context
# if we do not pass any arguments to the url, the request arguments
# should be empty
assert len(session_context.request.arguments) == 0
@pytest.mark.parametrize("querystring,requested", [
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__resource_files_requested(querystring, requested):
"""
Checks if the loading of resource files is requested by the autoload.js
response based on the value of the "resources" parameter.
"""
application = Application()
with ManagedServerLoop(application) as server:
response = http_get(server.io_loop,
autoload_url(server) + querystring)
resource_files_requested(response.body, requested=requested)
def test__autocreate_session_autoload():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__autocreate_session_autoload():
application = Application()
with ManagedServerLoop(application) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
response = http_get(server.io_loop,
autoload_url(server))
js = response.body
sessionid = extract_sessionid_from_json(js)
sessions = server.get_sessions('/')
assert 1 == len(sessions)
assert sessionid == sessions[0].id
def test__no_set_title_autoload():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__no_set_title_autoload():
application = Application()
with ManagedServerLoop(application) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
response = http_get(server.io_loop,
autoload_url(server))
js = response.body
use_for_title = extract_use_for_title_from_json(js)
assert use_for_title == "false"
def test__autocreate_session_doc():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__autocreate_session_doc():
application = Application()
with ManagedServerLoop(application) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
response = http_get(server.io_loop,
url(server))
html = response.body
sessionid = extract_sessionid_from_json(html)
sessions = server.get_sessions('/')
assert 1 == len(sessions)
assert sessionid == sessions[0].id
def test__no_autocreate_session_websocket():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__no_autocreate_session_websocket():
application = Application()
with ManagedServerLoop(application) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
websocket_open(server.io_loop,
ws_url(server) + "?bokeh-protocol-version=1.0")
sessions = server.get_sessions('/')
assert 0 == len(sessions)
def test__use_provided_session_autoload():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__use_provided_session_autoload():
application = Application()
with ManagedServerLoop(application) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
expected = 'foo'
response = http_get(server.io_loop,
autoload_url(server) + "&bokeh-session-id=" + expected)
js = response.body
sessionid = extract_sessionid_from_json(js)
assert expected == sessionid
sessions = server.get_sessions('/')
assert 1 == len(sessions)
assert expected == sessions[0].id
def test__use_provided_session_doc():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__use_provided_session_doc():
application = Application()
with ManagedServerLoop(application) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
expected = 'foo'
response = http_get(server.io_loop,
url(server) + "?bokeh-session-id=" + expected)
html = response.body
sessionid = extract_sessionid_from_json(html)
assert expected == sessionid
sessions = server.get_sessions('/')
assert 1 == len(sessions)
assert expected == sessions[0].id
def test__use_provided_session_websocket():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__use_provided_session_websocket():
application = Application()
with ManagedServerLoop(application) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
expected = 'foo'
url = ws_url(server) + \
"?bokeh-protocol-version=1.0" + \
"&bokeh-session-id=" + expected
websocket_open(server.io_loop,
url)
sessions = server.get_sessions('/')
assert 1 == len(sessions)
assert expected == sessions[0].id
def test__autocreate_signed_session_autoload():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__autocreate_signed_session_autoload():
application = Application()
with ManagedServerLoop(application, sign_sessions=True, secret_key='foo') as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
response = http_get(server.io_loop,
autoload_url(server))
js = response.body
sessionid = extract_sessionid_from_json(js)
sessions = server.get_sessions('/')
assert 1 == len(sessions)
assert sessionid == sessions[0].id
assert check_session_id_signature(sessionid, signed=True, secret_key='foo')
def test__autocreate_signed_session_doc():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__autocreate_signed_session_doc():
application = Application()
with ManagedServerLoop(application, sign_sessions=True, secret_key='foo') as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
response = http_get(server.io_loop,
url(server))
html = response.body
sessionid = extract_sessionid_from_json(html)
sessions = server.get_sessions('/')
assert 1 == len(sessions)
assert sessionid == sessions[0].id
assert check_session_id_signature(sessionid, signed=True, secret_key='foo')
def test__reject_unsigned_session_autoload():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__reject_unsigned_session_autoload():
application = Application()
with ManagedServerLoop(application, sign_sessions=True, secret_key='bar') as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
expected = 'foo'
with (pytest.raises(HTTPError)) as info:
http_get(server.io_loop,
autoload_url(server) + "&bokeh-session-id=" + expected)
assert 'Invalid session ID' in repr(info.value)
sessions = server.get_sessions('/')
assert 0 == len(sessions)
def test__reject_unsigned_session_doc():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__reject_unsigned_session_doc():
application = Application()
with ManagedServerLoop(application, sign_sessions=True, secret_key='bar') as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
expected = 'foo'
with (pytest.raises(HTTPError)) as info:
http_get(server.io_loop, url(server) + "?bokeh-session-id=" + expected)
assert 'Invalid session ID' in repr(info.value)
sessions = server.get_sessions('/')
assert 0 == len(sessions)
def test__reject_unsigned_session_websocket():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__reject_unsigned_session_websocket():
application = Application()
with ManagedServerLoop(application, sign_sessions=True, secret_key='bar') as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
expected = 'foo'
url = ws_url(server) + \
"?bokeh-protocol-version=1.0" + \
"&bokeh-session-id=" + expected
websocket_open(server.io_loop,
url)
sessions = server.get_sessions('/')
assert 0 == len(sessions)
def test__no_generate_session_autoload():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__no_generate_session_autoload():
application = Application()
with ManagedServerLoop(application, generate_session_ids=False) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
with (pytest.raises(HTTPError)) as info:
http_get(server.io_loop, autoload_url(server))
assert 'No bokeh-session-id provided' in repr(info.value)
sessions = server.get_sessions('/')
assert 0 == len(sessions)
def test__no_generate_session_doc():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__no_generate_session_doc():
application = Application()
with ManagedServerLoop(application, generate_session_ids=False) as server:
sessions = server.get_sessions('/')
assert 0 == len(sessions)
with (pytest.raises(HTTPError)) as info:
http_get(server.io_loop, url(server))
assert 'No bokeh-session-id provided' in repr(info.value)
sessions = server.get_sessions('/')
assert 0 == len(sessions)
@pytest.mark.skipif(sys.platform == "win32",
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__server_multiple_processes():
# Can't use an ioloop in this test
with mock.patch('tornado.httpserver.HTTPServer.add_sockets'):
with mock.patch('tornado.process.fork_processes') as tornado_fp:
application = Application()
server.Server(application, num_procs=3, port=0)
tornado_fp.assert_called_with(3)
def test__existing_ioloop_with_multiple_processes_exception():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__existing_ioloop_with_multiple_processes_exception():
application = Application()
ioloop_instance = IOLoop.instance() ; ioloop_instance # silence flake8
with pytest.raises(RuntimeError):
with ManagedServerLoop(application, num_procs=3):
pass
def test__actual_port_number():
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__actual_port_number():
application = Application()
with ManagedServerLoop(application, port=0) as server:
port = server.port
assert port > 0
http_get(server.io_loop, url(server))
def test__ioloop_not_forcibly_stopped():
3
View Source File : test_tornado.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_index():
application = Application()
with ManagedServerLoop(application) as server:
assert server._tornado.index is None
with ManagedServerLoop(application, index='foo') as server:
assert server._tornado.index == "foo"
def test_prefix():
3
View Source File : test_tornado.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_prefix():
application = Application()
with ManagedServerLoop(application) as server:
assert server._tornado.prefix == ""
for prefix in ["foo", "/foo", "/foo/", "foo/"]:
with ManagedServerLoop(application, prefix=prefix) as server:
assert server._tornado.prefix == "/foo"
def test_websocket_max_message_size_bytes():
3
View Source File : test_tornado.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_websocket_max_message_size_bytes():
app = Application()
t = tornado.BokehTornado({"/": app}, websocket_max_message_size_bytes=12345)
assert t.settings['websocket_max_message_size'] == 12345
def test_websocket_origins():
3
View Source File : test_tornado.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_websocket_origins():
application = Application()
with ManagedServerLoop(application) as server:
assert server._tornado.websocket_origins == set(["localhost:5006"])
# OK this is a bit of a confusing mess. The user-facing arg for server is
# "allow_websocket_origin" which gets converted to "extra_websocket_origins"
# for BokehTornado, which is exposed as a property "websocket_origins"...
with ManagedServerLoop(application, allow_websocket_origin=["foo"]) as server:
assert server._tornado.websocket_origins == set(["foo:80"])
with ManagedServerLoop(application, allow_websocket_origin=["foo:8080"]) as server:
assert server._tornado.websocket_origins == set(["foo:8080"])
with ManagedServerLoop(application, allow_websocket_origin=["foo:8080", "bar"]) as server:
assert server._tornado.websocket_origins == set(["foo:8080", "bar:80"])
def test_default_app_paths():
3
View Source File : test_tornado.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_default_app_paths():
app = Application()
t = tornado.BokehTornado({}, "", [])
assert t.app_paths == set()
t = tornado.BokehTornado({"/": app}, "", [])
assert t.app_paths == { "/" }
t = tornado.BokehTornado({"/": app, "/foo": app}, "", [])
assert t.app_paths == { "/", "/foo"}
# tried to use capsys to test what's actually logged and it wasn't
# working, in the meantime at least this tests that log_stats
# doesn't crash in various scenarios
def test_log_stats():
3
View Source File : test_tornado.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_log_stats():
application = Application()
with ManagedServerLoop(application) as server:
server._tornado._log_stats()
session1 = pull_session(session_id='session1',
url=url(server),
io_loop=server.io_loop)
session2 = pull_session(session_id='session2',
url=url(server),
io_loop=server.io_loop)
server._tornado._log_stats()
session1.close()
session2.close()
server._tornado._log_stats()
def test_metadata():
3
View Source File : test_client_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_minimal_connect_and_disconnect(self):
application = Application()
with ManagedServerLoop(application) as server:
# we don't have to start the server because it
# uses the same main loop as the client, so
# if we start either one it starts both
session = ClientSession(session_id='test_minimal_connect_and_disconnect',
io_loop = server.io_loop,
websocket_url = ws_url(server))
session.connect()
assert session.connected
def test_disconnect_on_error(self):
3
View Source File : test_client_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_disconnect_on_error(self):
application = Application()
with ManagedServerLoop(application) as server:
session = ClientSession(session_id='test_disconnect_on_error',
websocket_url=ws_url(server),
io_loop = server.io_loop)
session.connect()
assert session.connected
# send a bogus message using private fields
session._connection._socket.write_message(b"xx", binary=True)
# connection should now close on the server side
# and the client loop should end
session.loop_until_closed(suppress_warning=True)
assert not session.connected
session.close()
session.loop_until_closed(suppress_warning=True)
assert not session.connected
def test_connect_with_prefix(self):
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_port(self):
loop = IOLoop()
loop.make_current()
server = Server(Application(), port=1234)
assert server.port == 1234
def test_address(self):
3
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_address(self):
loop = IOLoop()
loop.make_current()
server = Server(Application(), address='0.0.0.0')
assert server.address == '0.0.0.0'
#-----------------------------------------------------------------------------
# Dev API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Private API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
0
View Source File : plot.py
License : BSD 3-Clause "New" or "Revised" License
Project Creator : CoffeaTeam
License : BSD 3-Clause "New" or "Revised" License
Project Creator : CoffeaTeam
def bokeh_plot(histo, jup_url="http://127.0.0.1:8889"):
if not isnotebook():
raise NotImplementedError("Only usable in jupyter notebook")
import bokeh.plotting.figure as bk_figure
from bokeh.io import show
from bokeh import palettes
from bokeh.layouts import row, column
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import RadioButtonGroup, CheckboxButtonGroup
from bokeh.models.widgets import RangeSlider, Div
from bokeh.io import output_notebook # enables plot interface in J notebook
# init bokeh
from bokeh.application import Application
from bokeh.application.handlers import FunctionHandler
from bokeh.core.validation import silence
from bokeh.core.validation.warnings import EMPTY_LAYOUT
silence(EMPTY_LAYOUT, True)
output_notebook()
# Set up widgets
cfg_labels = ["Ghost"]
wi_config = CheckboxButtonGroup(labels=cfg_labels, active=[0])
wi_dense_select = RadioButtonGroup(
labels=[ax.name for ax in histo.dense_axes()], active=0
)
wi_sparse_select = RadioButtonGroup(
labels=[ax.name for ax in histo.sparse_axes()], active=0
)
# Dense widgets
sliders = {}
for ax in histo.dense_axes():
edge_vals = (histo.axis(ax.name).edges()[0], histo.axis(ax.name).edges()[-1])
_smallest_bin = numpy.min(numpy.diff(histo.axis(ax.name).edges()))
sliders[ax.name] = RangeSlider(
title=ax.name,
value=edge_vals,
start=edge_vals[0],
end=edge_vals[1],
step=_smallest_bin,
name=ax.name,
)
# Cat widgets
togglers = {}
for ax in histo.sparse_axes():
togglers[ax.name] = CheckboxButtonGroup(
labels=[i.name for i in ax.identifiers()], active=[0], name=ax.name
)
# Toggles for all widgets
configers = {}
for ax in histo.sparse_axes():
configers[ax.name] = CheckboxButtonGroup(
labels=["Display", "Ghost"], active=[0, 1], name=ax.name
)
for ax in histo.dense_axes():
configers[ax.name] = CheckboxButtonGroup(
labels=["Display"], active=[0], name=ax.name
)
# Figure
fig = bk_figure(
title="1D Projection",
plot_width=500,
plot_height=500,
min_border=20,
toolbar_location=None,
)
fig.yaxis.axis_label = "N"
fig.xaxis.axis_label = "Quantity"
# Iterate over possible overlays
_max_idents = 0 # Max number of simultaneou histograms
for ax in histo.sparse_axes():
_max_idents = max(_max_idents, len([i.name for i in ax.identifiers()]))
# Data source list
sources = []
sources_ghost = []
for i in range(_max_idents):
sources.append(ColumnDataSource(dict(left=[], top=[], right=[], bottom=[])))
sources_ghost.append(
ColumnDataSource(dict(left=[], top=[], right=[], bottom=[]))
)
# Hist list
hists = []
hists_ghost = []
for i in range(_max_idents):
if _max_idents < 10:
_color = palettes.Category10[min(max(3, _max_idents), 10)][i]
else:
_color = palettes.magma(_max_idents)[i]
hists.append(
fig.quad(
left="left",
right="right",
top="top",
bottom="bottom",
source=sources[i],
alpha=0.9,
color=_color,
)
)
hists_ghost.append(
fig.quad(
left="left",
right="right",
top="top",
bottom="bottom",
source=sources_ghost[i],
alpha=0.05,
color=_color,
)
)
def update_data(attrname, old, new):
sparse_active = wi_sparse_select.active
sparse_name = [ax.name for ax in histo.sparse_axes()][sparse_active]
sparse_other = [ax.name for ax in histo.sparse_axes() if ax.name != sparse_name]
dense_active = wi_dense_select.active
dense_name = [ax.name for ax in histo.dense_axes()][dense_active]
dense_other = [ax.name for ax in histo.dense_axes() if ax.name != dense_name]
# Apply cuts in projections
_h = histo.copy()
for proj_ax in sparse_other:
_idents = histo.axis(proj_ax).identifiers()
_labels = [ident.name for ident in _idents]
if 0 in configers[proj_ax].active:
_h = _h.integrate(
proj_ax, [_labels[i] for i in togglers[proj_ax].active]
)
else:
_h = _h.integrate(proj_ax)
for proj_ax in dense_other:
_h = _h.integrate(
proj_ax, slice(sliders[proj_ax].value[0], sliders[proj_ax].value[1])
)
for cat_ix in range(_max_idents):
# Update histo for each toggled overlay
if cat_ix in togglers[sparse_name].active:
cat_value = histo.axis(sparse_name).identifiers()[cat_ix]
h1d = _h.integrate(sparse_name, cat_value)
# Get shown histogram
values = h1d.project(dense_name).values()
if values != {}:
h = values[()]
bins = h1d.axis(dense_name).edges()
# Apply cuts on shown axis
bin_los = bins[:-1][bins[:-1] > sliders[dense_name].value[0]]
bin_his = bins[1:][bins[1:] < sliders[dense_name].value[1]]
new_bins = numpy.intersect1d(bin_los, bin_his)
bin_ixs = numpy.searchsorted(bins, new_bins)[:-1]
h = h[bin_ixs]
sources[cat_ix].data = dict(
left=new_bins[:-1],
right=new_bins[1:],
top=h,
bottom=numpy.zeros_like(h),
)
else:
sources[cat_ix].data = dict(left=[], right=[], top=[], bottom=[])
# Add ghosts
if 0 in wi_config.active:
h1d = histo.integrate(sparse_name, cat_value)
for proj_ax in sparse_other:
_idents = histo.axis(proj_ax).identifiers()
_labels = [ident.name for ident in _idents]
if 1 not in configers[proj_ax].active:
h1d = h1d.integrate(
proj_ax, [_labels[i] for i in togglers[proj_ax].active]
)
else:
h1d = h1d.integrate(proj_ax)
values = h1d.project(dense_name).values()
if values != {}:
h = h1d.project(dense_name).values()[()]
bins = h1d.axis(dense_name).edges()
sources_ghost[cat_ix].data = dict(
left=bins[:-1],
right=bins[1:],
top=h,
bottom=numpy.zeros_like(h),
)
else:
sources_ghost[cat_ix].data = dict(
left=[], right=[], top=[], bottom=[]
)
else:
sources[cat_ix].data = dict(left=[], right=[], top=[], bottom=[])
sources_ghost[cat_ix].data = dict(left=[], right=[], top=[], bottom=[])
# Cosmetics
fig.xaxis.axis_label = dense_name
for name, slider in sliders.items():
slider.on_change("value", update_data)
for name, toggler in togglers.items():
toggler.on_change("active", update_data)
for name, configer in configers.items():
configer.on_change("active", update_data)
# Button
for w in [wi_dense_select, wi_sparse_select, wi_config]:
w.on_change("active", update_data)
from bokeh.models.widgets import Panel, Tabs
layout = row(
fig,
column(
Div(
text=" < b>Overlay Axis: < /b>",
style={"font-size": "100%", "color": "black"},
),
wi_sparse_select,
Div(
text=" < b>Plot Axis: < /b>", style={"font-size": "100%", "color": "black"}
),
wi_dense_select,
Div(
text=" < b>Categorical Cuts: < /b>",
style={"font-size": "100%", "color": "black"},
),
*[toggler for name, toggler in togglers.items()],
Div(
text=" < b>Dense Cuts: < /b>", style={"font-size": "100%", "color": "black"}
),
*[slider for name, slider in sliders.items()]
),
)
# Config prep
incl_lists = [[], [], []]
for i, key in enumerate(list(configers.keys())):
incl_lists[i // max(5, len(list(configers.keys())) / 3)].append(
Div(
text=" < b>{}: < /b>".format(key),
style={"font-size": "70%", "color": "black"},
)
)
incl_lists[i // max(5, len(list(configers.keys())) / 3)].append(configers[key])
layout_cfgs = column(
row(
column(
Div(
text=" < b>Configs: < /b>",
style={"font-size": "100%", "color": "black"},
),
wi_config,
)
),
Div(
text=" < b>Axis togglers: < /b>", style={"font-size": "100%", "color": "black"}
),
row(
column(incl_lists[0]),
column(incl_lists[1]),
column(incl_lists[2]),
),
)
# Update active buttons
def update_layout(attrname, old, new):
active_axes = [None]
for name, wi in configers.items():
if 0 in wi.active:
active_axes.append(name)
for child in layout.children[1].children:
if child.name not in active_axes:
child.visible = False
else:
child.visible = True
for name, configer in configers.items():
configer.on_change("active", update_layout)
tab1 = Panel(child=layout, title="Projection")
tab2 = Panel(child=layout_cfgs, title="Configs")
tabs = Tabs(tabs=[tab1, tab2])
def modify_doc(doc):
doc.add_root(row(tabs, width=800))
doc.title = "Sliders"
handler = FunctionHandler(modify_doc)
app = Application(handler)
show(app, notebook_url=jup_url)
update_data("", "", "")
0
View Source File : plot_buffer.py
License : GNU General Public License v3.0
Project Creator : eqcorrscan
License : GNU General Public License v3.0
Project Creator : eqcorrscan
def __init__(
self,
rt_client: _StreamingClient,
plot_length: float,
tribe: RealTimeTribe,
inventory: Inventory,
detections: list,
update_interval: float = 100.,
plot_height: int = 800,
plot_width: int = 1500,
exclude_channels: iter = (),
offline: bool = False,
new_event_loop: bool = True,
**plot_data_options,
) -> None:
if new_event_loop:
# Set up a new event loop for the plots
asyncio.set_event_loop(asyncio.new_event_loop())
channels = [tr.id for tr in rt_client.stream
if tr.stats.channel not in exclude_channels]
Logger.debug("Plot will contain the following channels: {0}".format(
channels))
self.channels = sorted(channels)
self.tribe = tribe
self.plot_length = plot_length
self.inventory = inventory
self.detections = detections
self.hover = HoverTool(
tooltips=[
("UTCDateTime", "@time{%m/%d %H:%M:%S}"),
("Amplitude", "@data")],
formatters={'time': 'datetime'},
mode='vline')
self.map_hover = HoverTool(
tooltips=[
("Latitude", "@lats"),
("Longitude", "@lons"),
("ID", "@id")])
self.tools = "pan,wheel_zoom,reset"
self.plot_options = {
"plot_width": int(2 * (plot_width / 3)),
"plot_height": int((plot_height - 20) / len(channels)),
"tools": [self.hover], "x_axis_type": "datetime"}
self.map_options = {
"plot_width": int(plot_width / 3), "plot_height": plot_height,
"tools": [self.map_hover, self.tools]}
self.updateValue = True
Logger.info("Initializing plotter")
make_doc = partial(
define_plot, rt_client=rt_client, channels=channels,
tribe=self.tribe, inventory=self.inventory,
detections=self.detections, map_options=self.map_options,
plot_options=self.plot_options, plot_length=self.plot_length,
update_interval=update_interval, offline=offline,
**plot_data_options)
self.apps = {'/RT_EQcorrscan': Application(FunctionHandler(make_doc))}
self.server = Server(self.apps)
self.server.start()
Logger.info("Plotting started")
self.threads = []
def background_run(self):
0
View Source File : webapp.py
License : GNU General Public License v3.0
Project Creator : happydasch
License : GNU General Public License v3.0
Project Creator : happydasch
def _run_server(fnc_make_document, notebook_url='localhost:8889',
iplot=True, ioloop=None, address='localhost', port=8889, autostart=False):
'''
Runs a Bokeh webserver application. Documents will be created using
fnc_make_document
'''
handler = FunctionHandler(fnc_make_document)
app = Application(handler)
ipython = iplot and 'ipykernel' in sys.modules
if ipython:
try:
get_ipython
except:
ipython = False
if ipython:
show(app, notebook_url=notebook_url) # noqa
else:
apps = {'/': app}
if autostart:
print(f'Browser is launching at: http://localhost:{port}')
view(f'http://localhost:{port}')
else:
print(f'Open browser at: http://localhost:{port}')
server = Server(apps, port=port, allow_websocket_origin=[address], io_loop=ioloop)
if ioloop is None:
server.run_until_shutdown()
else:
server.start()
ioloop.start()
0
View Source File : serve.py
License : BSD 3-Clause "New" or "Revised" License
Project Creator : holoviz
License : BSD 3-Clause "New" or "Revised" License
Project Creator : holoviz
def customize_kwargs(self, args, server_kwargs):
'''Allows subclasses to customize ``server_kwargs``.
Should modify and return a copy of the ``server_kwargs`` dictionary.
'''
kwargs = dict(server_kwargs)
if 'index' not in kwargs:
kwargs['index'] = INDEX_HTML
# Handle tranquilized functions in the supplied functions
kwargs['extra_patterns'] = patterns = kwargs.get('extra_patterns', [])
if args.static_dirs:
static_dirs = parse_vars(args.static_dirs)
patterns += get_static_routes(static_dirs)
files = []
for f in args.files:
if args.glob:
files.extend(glob(f))
else:
files.append(f)
if args.index and not args.index.endswith('.html'):
found = False
for ext in self._extensions:
index = args.index if args.index.endswith(ext) else f'{args.index}{ext}'
if any(f.endswith(index) for f in files):
found = True
if not found:
raise ValueError(
"The --index argument must either specify a jinja2 "
"template with a .html file extension or select one "
"of the applications being served as the default. "
f"The specified application {index!r} could not be "
"found."
)
# Handle tranquilized functions in the supplied functions
if args.rest_provider in REST_PROVIDERS:
pattern = REST_PROVIDERS[args.rest_provider](files, args.rest_endpoint)
patterns.extend(pattern)
elif args.rest_provider is not None:
raise ValueError("rest-provider %r not recognized." % args.rest_provider)
config.autoreload = args.autoreload
if config.autoreload:
for f in files:
watch(f)
if args.setup:
setup_path = args.setup
with open(setup_path) as f:
setup_source = f.read()
nodes = ast.parse(setup_source, os.fspath(setup_path))
code = compile(nodes, filename=setup_path, mode='exec', dont_inherit=True)
module_name = 'panel_setup_module'
module = ModuleType(module_name)
module.__dict__['__file__'] = os.path.abspath(setup_path)
exec(code, module.__dict__)
state._setup_module = module
if args.warm or args.autoreload:
argvs = {f: args.args for f in files}
applications = build_single_handler_applications(files, argvs)
if args.autoreload:
with record_modules():
for app in applications.values():
doc = app.create_document()
with set_curdoc(doc):
state._on_load(None)
_cleanup_doc(doc)
else:
for app in applications.values():
doc = app.create_document()
with set_curdoc(doc):
state._on_load(None)
_cleanup_doc(doc)
prefix = args.prefix
if prefix is None:
prefix = ""
prefix = prefix.strip("/")
if prefix:
prefix = "/" + prefix
config.profiler = args.profiler
if args.admin:
from ..io.admin import admin_panel
from ..io.server import per_app_patterns
config._admin = True
app = Application(FunctionHandler(admin_panel))
unused_timeout = args.check_unused_sessions or 15000
app_ctx = AdminApplicationContext(app, unused_timeout=unused_timeout, url='/admin')
if all(not isinstance(handler, DocumentLifecycleHandler) for handler in app._handlers):
app.add(DocumentLifecycleHandler())
app_patterns = []
for p in per_app_patterns:
route = '/admin' + p[0]
context = {"application_context": app_ctx}
route = prefix + route
app_patterns.append((route, p[1], context))
websocket_path = None
for r in app_patterns:
if r[0].endswith("/ws"):
websocket_path = r[0]
if not websocket_path:
raise RuntimeError("Couldn't find websocket path")
for r in app_patterns:
r[2]["bokeh_websocket_path"] = websocket_path
try:
import snakeviz
SNAKEVIZ_PATH = os.path.join(os.path.dirname(snakeviz.__file__), 'static')
app_patterns.append(
('/snakeviz/static/(.*)', StaticFileHandler, dict(path=SNAKEVIZ_PATH))
)
except Exception:
pass
patterns.extend(app_patterns)
config.session_history = args.session_history
if args.rest_session_info:
pattern = REST_PROVIDERS['param'](files, 'rest')
patterns.extend(pattern)
state.publish('session_info', state, ['session_info'])
if args.num_threads is not None:
if config.nthreads is not None:
raise ValueError(
"Supply num_threads either using the environment variable "
"PANEL_NUM_THREADS or as an explicit argument, not both."
)
config.nthreads = args.num_threads
if args.oauth_provider:
config.oauth_provider = args.oauth_provider
config.oauth_expiry = args.oauth_expiry_days
if config.oauth_key and args.oauth_key:
raise ValueError(
"Supply OAuth key either using environment variable "
"or via explicit argument, not both."
)
elif args.oauth_key:
config.oauth_key = args.oauth_key
elif not config.oauth_key:
raise ValueError(
"When enabling an OAuth provider you must supply "
"a valid oauth_key either using the --oauth-key "
"CLI argument or PANEL_OAUTH_KEY environment "
"variable."
)
if config.oauth_secret and args.oauth_secret:
raise ValueError(
"Supply OAuth secret either using environment variable "
"or via explicit argument, not both."
)
elif args.oauth_secret:
config.oauth_secret = args.oauth_secret
elif not config.oauth_secret:
raise ValueError(
"When enabling an OAuth provider you must supply "
"a valid OAuth secret either using the --oauth-secret "
"CLI argument or PANEL_OAUTH_SECRET environment "
"variable."
)
if args.oauth_extra_params:
config.oauth_extra_params = ast.literal_eval(args.oauth_extra_params)
if config.oauth_encryption_key and args.oauth_encryption_key:
raise ValueError(
"Supply OAuth encryption key either using environment "
"variable or via explicit argument, not both."
)
elif args.oauth_encryption_key:
encryption_key = args.oauth_encryption_key.encode('ascii')
try:
key = base64.urlsafe_b64decode(encryption_key)
except Exception:
raise ValueError("OAuth encryption key was not a valid base64 "
"string. Generate an encryption key with "
"`panel oauth-secret` and ensure you did not "
"truncate the returned string.")
if len(key) != 32:
raise ValueError(
"OAuth encryption key must be 32 url-safe "
"base64-encoded bytes."
)
config.oauth_encryption_key = encryption_key
else:
print("WARNING: OAuth has not been configured with an "
"encryption key and will potentially leak "
"credentials in cookies and a JWT token embedded "
"in the served website. Use at your own risk or "
"generate a key with the `panel oauth-key` CLI "
"command and then provide it to `panel serve` "
"using the PANEL_OAUTH_ENCRYPTION environment "
"variable or the --oauth-encryption-key CLI "
"argument.")
if config.oauth_encryption_key:
try:
from cryptography.fernet import Fernet
except ImportError:
raise ImportError(
"Using OAuth2 provider with Panel requires the "
"cryptography library. Install it with `pip install "
"cryptography` or `conda install cryptography`."
)
state.encryption = Fernet(config.oauth_encryption_key)
if args.cookie_secret and config.cookie_secret:
raise ValueError(
"Supply cookie secret either using environment "
"variable or via explicit argument, not both."
)
elif args.cookie_secret:
config.cookie_secret = args.cookie_secret
else:
raise ValueError(
"When enabling an OAuth provider you must supply "
"a valid cookie_secret either using the --cookie-secret "
"CLI argument or the PANEL_COOKIE_SECRET environment "
"variable."
)
kwargs['auth_provider'] = OAuthProvider(error_template=args.oauth_error_template)
if args.oauth_redirect_uri and config.oauth_redirect_uri:
raise ValueError(
"Supply OAuth redirect URI either using environment "
"variable or via explicit argument, not both."
)
elif args.oauth_redirect_uri:
config.oauth_redirect_uri = args.oauth_redirect_uri
if args.oauth_jwt_user and config.oauth_jwt_user:
raise ValueError(
"Supply OAuth JWT user either using environment "
"variable or via explicit argument, not both."
)
elif args.oauth_jwt_user:
config.oauth_jwt_user = args.oauth_jwt_user
if config.cookie_secret:
kwargs['cookie_secret'] = config.cookie_secret
return kwargs
0
View Source File : serve.py
License : BSD 3-Clause "New" or "Revised" License
Project Creator : holzschu
License : BSD 3-Clause "New" or "Revised" License
Project Creator : holzschu
def invoke(self, args):
'''
'''
basicConfig(format=args.log_format, filename=args.log_file)
# This is a bit of a fudge. We want the default log level for non-server
# cases to be None, i.e. we don't set a log level. But for the server we
# do want to set the log level to INFO if nothing else overrides that.
log_level = settings.py_log_level(args.log_level)
if log_level is None:
log_level = logging.INFO
logging.getLogger('bokeh').setLevel(log_level)
if args.use_config is not None:
log.info("Using override config file: {}".format(args.use_config))
settings.load_config(args.use_config)
# protect this import inside a function so that "bokeh info" can work
# even if Tornado is not installed
from bokeh.server.server import Server
files = []
for f in args.files:
if args.glob:
files.extend(glob(f))
else:
files.append(f)
argvs = { f : args.args for f in files}
applications = build_single_handler_applications(files, argvs)
if len(applications) == 0:
# create an empty application by default
applications['/'] = Application()
# rename args to be compatible with Server
if args.keep_alive is not None:
args.keep_alive_milliseconds = args.keep_alive
if args.check_unused_sessions is not None:
args.check_unused_sessions_milliseconds = args.check_unused_sessions
if args.unused_session_lifetime is not None:
args.unused_session_lifetime_milliseconds = args.unused_session_lifetime
if args.stats_log_frequency is not None:
args.stats_log_frequency_milliseconds = args.stats_log_frequency
if args.mem_log_frequency is not None:
args.mem_log_frequency_milliseconds = args.mem_log_frequency
server_kwargs = { key: getattr(args, key) for key in ['port',
'address',
'allow_websocket_origin',
'num_procs',
'prefix',
'index',
'keep_alive_milliseconds',
'check_unused_sessions_milliseconds',
'unused_session_lifetime_milliseconds',
'stats_log_frequency_milliseconds',
'mem_log_frequency_milliseconds',
'use_xheaders',
'websocket_max_message_size',
]
if getattr(args, key, None) is not None }
server_kwargs['sign_sessions'] = settings.sign_sessions()
server_kwargs['secret_key'] = settings.secret_key_bytes()
server_kwargs['ssl_certfile'] = settings.ssl_certfile(getattr(args, 'ssl_certfile', None))
server_kwargs['ssl_keyfile'] = settings.ssl_keyfile(getattr(args, 'ssl_keyfile', None))
server_kwargs['ssl_password'] = settings.ssl_password()
server_kwargs['generate_session_ids'] = True
if args.session_ids is None:
# no --session-ids means use the env vars
pass
elif args.session_ids == 'unsigned':
server_kwargs['sign_sessions'] = False
elif args.session_ids == 'signed':
server_kwargs['sign_sessions'] = True
elif args.session_ids == 'external-signed':
server_kwargs['sign_sessions'] = True
server_kwargs['generate_session_ids'] = False
else:
raise RuntimeError("argparse should have filtered out --session-ids mode " +
args.session_ids)
if server_kwargs['sign_sessions'] and not server_kwargs['secret_key']:
die("To sign sessions, the BOKEH_SECRET_KEY environment variable must be set; " +
"the `bokeh secret` command can be used to generate a new key.")
auth_module_path = settings.auth_module(getattr(args, 'auth_module', None))
if auth_module_path:
server_kwargs['auth_provider'] = AuthModule(auth_module_path)
else:
server_kwargs['auth_provider'] = NullAuth()
server_kwargs['xsrf_cookies'] = settings.xsrf_cookies(getattr(args, 'enable_xsrf_cookies', False))
server_kwargs['cookie_secret'] = settings.cookie_secret(getattr(args, 'cookie_secret', None))
server_kwargs['use_index'] = not args.disable_index
server_kwargs['redirect_root'] = not args.disable_index_redirect
server_kwargs['autoreload'] = args.dev is not None
def find_autoreload_targets(app_path):
path = os.path.abspath(app_path)
if not os.path.isdir(path):
return
for path, subdirs, files in os.walk(path):
for name in files:
if (fnmatch(name, '*.html') or
fnmatch(name, '*.css') or
fnmatch(name, '*.yaml')):
log.info("Watching: " + os.path.join(path, name))
watch(os.path.join(path, name))
def add_optional_autoreload_files(file_list):
for filen in file_list:
if os.path.isdir(filen):
log.warning("Cannot watch directory " + filen)
continue
log.info("Watching: " + filen)
watch(filen)
if server_kwargs['autoreload']:
if len(applications.keys()) != 1:
die("--dev can only support a single app.")
if server_kwargs['num_procs'] != 1:
log.info("Running in --dev mode. --num-procs is limited to 1.")
server_kwargs['num_procs'] = 1
find_autoreload_targets(args.files[0])
add_optional_autoreload_files(args.dev)
with report_server_init_errors(**server_kwargs):
server = Server(applications, **server_kwargs)
if args.show:
# we have to defer opening in browser until we start up the server
def show_callback():
for route in applications.keys():
server.show(route)
server.io_loop.add_callback(show_callback)
address_string = 'localhost'
if server.address is not None and server.address != '':
address_string = server.address
for route in sorted(applications.keys()):
url = "http://%s:%d%s%s" % (address_string, server.port, server.prefix, route)
log.info("Bokeh app running at: %s" % url)
log.info("Starting Bokeh server with process id: %d" % os.getpid())
server.run_until_shutdown()
#-----------------------------------------------------------------------------
# Dev API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Private API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
__doc__ = format_docstring(__doc__,
0
View Source File : util.py
License : BSD 3-Clause "New" or "Revised" License
Project Creator : holzschu
License : BSD 3-Clause "New" or "Revised" License
Project Creator : holzschu
def build_single_handler_application(path, argv=None):
''' Return a Bokeh application built using a single handler for a script,
notebook, or directory.
In general a Bokeh :class:`~bokeh.application.application.Application` may
have any number of handlers to initialize :class:`~bokeh.document.Document`
objects for new client sessions. However, in many cases only a single
handler is needed. This function examines the ``path`` provided, and
returns an ``Application`` initialized with one of the following handlers:
* :class:`~bokeh.application.handlers.script.ScriptHandler` when ``path``
is to a ``.py`` script.
* :class:`~bokeh.application.handlers.notebook.NotebookHandler` when
``path`` is to an ``.ipynb`` Jupyter notebook.
* :class:`~bokeh.application.handlers.directory.DirectoryHandler` when
``path`` is to a directory containing a ``main.py`` script.
Args:
path (str) : path to a file or directory for creating a Bokeh
application.
argv (seq[str], optional) : command line arguments to pass to the
application handler
Returns:
:class:`~bokeh.application.application.Application`
Raises:
RuntimeError
Notes:
If ``path`` ends with a file ``main.py`` then a warning will be printed
regarding running directory-style apps by passing the directory instead.
'''
argv = argv or []
path = os.path.abspath(path)
# There are certainly race conditions here if the file/directory is deleted
# in between the isdir/isfile tests and subsequent code. But it would be a
# failure if they were not there to begin with, too (just a different error)
if os.path.isdir(path):
handler = DirectoryHandler(filename=path, argv=argv)
elif os.path.isfile(path):
if path.endswith(".ipynb"):
handler = NotebookHandler(filename=path, argv=argv)
elif path.endswith(".py"):
if path.endswith("main.py"):
warnings.warn(DIRSTYLE_MAIN_WARNING)
handler = ScriptHandler(filename=path, argv=argv)
else:
raise ValueError("Expected a '.py' script or '.ipynb' notebook, got: '%s'" % path)
else:
raise ValueError("Path for Bokeh server application does not exist: %s" % path)
if handler.failed:
raise RuntimeError("Error loading %s:\n\n%s\n%s " % (path, handler.error, handler.error_detail))
application = Application(handler)
return application
def build_single_handler_applications(paths, argvs=None):
0
View Source File : run_dashboard.py
License : MIT License
Project Creator : OpenSourceEconomics
License : MIT License
Project Creator : OpenSourceEconomics
def run_dashboard(
database_path,
no_browser,
port,
updating_options,
):
"""Start the dashboard pertaining to one database.
Args:
database_path (str or pathlib.Path): Path to an sqlite3 file which
typically has the file extension ``.db``.
no_browser (bool): If True the dashboard does not open in the browser.
port (int): Port where to display the dashboard.
updating_options (dict): Specification how to update the plotting data.
It contains "rollover", "update_frequency", "update_chunk", "jump" and
"stride".
"""
port = _find_free_port() if port is None else port
port = int(port)
if not isinstance(database_path, (str, pathlib.Path)):
raise TypeError(
"database_path must be string or pathlib.Path. ",
f"You supplied {type(database_path)}.",
)
else:
database_path = pathlib.Path(database_path)
if not database_path.exists():
raise ValueError(
f"The database path {database_path} you supplied does not exist."
)
session_data = {
"last_retrieved": 0,
"database_path": database_path,
"callbacks": {},
}
app_func = partial(
dashboard_app,
session_data=session_data,
updating_options=updating_options,
)
apps = {"/": Application(FunctionHandler(app_func))}
_start_server(apps=apps, port=port, no_browser=no_browser)
def _find_free_port():
0
View Source File : serve.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def invoke(self, args):
'''
'''
# protect this import inside a function so that "bokeh info" can work
# even if Tornado is not installed
from bokeh.server.server import Server
argvs = { f : args.args for f in args.files}
applications = build_single_handler_applications(args.files, argvs)
log_level = getattr(logging, args.log_level.upper())
basicConfig(level=log_level, format=args.log_format, filename=args.log_file)
if len(applications) == 0:
# create an empty application by default
applications['/'] = Application()
# rename args to be compatible with Server
if args.keep_alive is not None:
args.keep_alive_milliseconds = args.keep_alive
if args.check_unused_sessions is not None:
args.check_unused_sessions_milliseconds = args.check_unused_sessions
if args.unused_session_lifetime is not None:
args.unused_session_lifetime_milliseconds = args.unused_session_lifetime
if args.stats_log_frequency is not None:
args.stats_log_frequency_milliseconds = args.stats_log_frequency
if args.mem_log_frequency is not None:
args.mem_log_frequency_milliseconds = args.mem_log_frequency
server_kwargs = { key: getattr(args, key) for key in ['port',
'address',
'allow_websocket_origin',
'num_procs',
'prefix',
'index',
'keep_alive_milliseconds',
'check_unused_sessions_milliseconds',
'unused_session_lifetime_milliseconds',
'stats_log_frequency_milliseconds',
'mem_log_frequency_milliseconds',
'use_xheaders',
'websocket_max_message_size',
]
if getattr(args, key, None) is not None }
server_kwargs['sign_sessions'] = settings.sign_sessions()
server_kwargs['secret_key'] = settings.secret_key_bytes()
server_kwargs['generate_session_ids'] = True
if args.session_ids is None:
# no --session-ids means use the env vars
pass
elif args.session_ids == 'unsigned':
server_kwargs['sign_sessions'] = False
elif args.session_ids == 'signed':
server_kwargs['sign_sessions'] = True
elif args.session_ids == 'external-signed':
server_kwargs['sign_sessions'] = True
server_kwargs['generate_session_ids'] = False
else:
raise RuntimeError("argparse should have filtered out --session-ids mode " +
args.session_ids)
if server_kwargs['sign_sessions'] and not server_kwargs['secret_key']:
die("To sign sessions, the BOKEH_SECRET_KEY environment variable must be set; " +
"the `bokeh secret` command can be used to generate a new key.")
server_kwargs['use_index'] = not args.disable_index
server_kwargs['redirect_root'] = not args.disable_index_redirect
server_kwargs['autoreload'] = args.dev is not None
def find_autoreload_targets(app_path):
path = os.path.abspath(app_path)
if not os.path.isdir(path):
return
for path, subdirs, files in os.walk(path):
for name in files:
if (fnmatch(name, '*.html') or
fnmatch(name, '*.css') or
fnmatch(name, '*.yaml')):
log.info("Watching: " + os.path.join(path, name))
watch(os.path.join(path, name))
def add_optional_autoreload_files(file_list):
for filen in file_list:
if os.path.isdir(filen):
log.warning("Cannot watch directory " + filen)
continue
log.info("Watching: " + filen)
watch(filen)
if server_kwargs['autoreload']:
if len(applications.keys()) != 1:
die("--dev can only support a single app.")
if server_kwargs['num_procs'] != 1:
log.info("Running in --dev mode. --num-procs is limited to 1.")
server_kwargs['num_procs'] = 1
find_autoreload_targets(args.files[0])
add_optional_autoreload_files(args.dev)
with report_server_init_errors(**server_kwargs):
server = Server(applications, **server_kwargs)
if args.show:
# we have to defer opening in browser until we start up the server
def show_callback():
for route in applications.keys():
server.show(route)
server.io_loop.add_callback(show_callback)
address_string = 'localhost'
if server.address is not None and server.address != '':
address_string = server.address
for route in sorted(applications.keys()):
url = "http://%s:%d%s%s" % (address_string, server.port, server.prefix, route)
log.info("Bokeh app running at: %s" % url)
log.info("Starting Bokeh server with process id: %d" % os.getpid())
server.run_until_shutdown()
#-----------------------------------------------------------------------------
# Dev API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Private API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
__doc__ = format_docstring(__doc__,
0
View Source File : test_contexts.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_create_session_if_needed_bad_sessionid(self):
app = Application()
c = bsc.ApplicationContext(app, io_loop="ioloop")
class FakeRequest(object):
arguments = dict(foo=10)
req = FakeRequest()
r = c.create_session_if_needed("", request=req)
with pytest.raises(bsc.ProtocolError) as e:
r.result()
assert str(e).endswith("Session ID must not be empty")
#-----------------------------------------------------------------------------
# Dev API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Private API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
0
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test_get_sessions():
application = Application()
with ManagedServerLoop(application) as server:
server_sessions = server.get_sessions('/')
assert len(server_sessions) == 0
http_get(server.io_loop, url(server))
server_sessions = server.get_sessions('/')
assert len(server_sessions) == 1
http_get(server.io_loop, url(server))
server_sessions = server.get_sessions('/')
assert len(server_sessions) == 2
server_sessions = server.get_sessions()
assert len(server_sessions) == 2
with pytest.raises(ValueError):
server.get_sessions("/foo")
with ManagedServerLoop({"/foo": application, "/bar": application}) as server:
http_get(server.io_loop, url(server) + "foo")
server_sessions = server.get_sessions('/foo')
assert len(server_sessions) == 1
server_sessions = server.get_sessions('/bar')
assert len(server_sessions) == 0
server_sessions = server.get_sessions()
assert len(server_sessions) == 1
http_get(server.io_loop, url(server) + "foo")
server_sessions = server.get_sessions('/foo')
assert len(server_sessions) == 2
server_sessions = server.get_sessions('/bar')
assert len(server_sessions) == 0
server_sessions = server.get_sessions()
assert len(server_sessions) == 2
http_get(server.io_loop, url(server) + "bar")
server_sessions = server.get_sessions('/foo')
assert len(server_sessions) == 2
server_sessions = server.get_sessions('/bar')
assert len(server_sessions) == 1
server_sessions = server.get_sessions()
assert len(server_sessions) == 3
# examples:
# "sessionid" : "NzlNoPfEYJahnPljE34xI0a5RSTaU1Aq1Cx5"
# 'sessionid':'NzlNoPfEYJahnPljE34xI0a5RSTaU1Aq1Cx5'
sessionid_in_json = re.compile("""["']sessionid["'] *: *["']([^"]+)["']""")
0
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__lifecycle_hooks():
application = Application()
handler = HookTestHandler()
application.add(handler)
with ManagedServerLoop(application, check_unused_sessions_milliseconds=30) as server:
# wait for server callbacks to run before we mix in the
# session, this keeps the test deterministic
def check_done():
if len(handler.hooks) == 4:
server.io_loop.stop()
server_load_checker = PeriodicCallback(check_done, 1)
server_load_checker.start()
server.io_loop.start()
server_load_checker.stop()
# now we create a session
client_session = pull_session(session_id='test__lifecycle_hooks',
url=url(server),
io_loop=server.io_loop)
client_doc = client_session.document
assert len(client_doc.roots) == 1
server_session = server.get_session('/', client_session.id)
server_doc = server_session.document
assert len(server_doc.roots) == 1
# we have to capture these here for examination later, since after
# the session is closed, doc.roots will be emptied
client_hook_list = client_doc.roots[0]
server_hook_list = server_doc.roots[0]
client_session.close()
# expire the session quickly rather than after the
# usual timeout
server_session.request_expiration()
def on_done():
server.io_loop.stop()
server.io_loop.call_later(0.1, on_done)
server.io_loop.start()
assert handler.hooks == ["server_loaded",
"next_tick_server",
"timeout_server",
"periodic_server",
"session_created",
"next_tick_session",
"modify",
"timeout_session",
"periodic_session",
"session_destroyed",
"server_unloaded"]
assert handler.load_count == 1
assert handler.unload_count == 1
# this is 3 instead of 6 because locked callbacks on destroyed sessions
# are turned into no-ops
assert handler.session_creation_async_value == 3
assert client_doc.title == "Modified"
assert server_doc.title == "Modified"
# only the handler sees the event that adds "session_destroyed" since
# the session is shut down at that point.
assert client_hook_list.hooks == ["session_created", "modify"]
assert server_hook_list.hooks == ["session_created", "modify"]
def test__request_in_session_context():
0
View Source File : test_server.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def test__ioloop_not_forcibly_stopped():
# Issue #5494
application = Application()
loop = IOLoop()
loop.make_current()
server = Server(application, io_loop=loop)
server.start()
result = []
def f():
server.unlisten()
server.stop()
# If server.stop() were to stop the Tornado IO loop,
# g() wouldn't be called and `result` would remain empty.
loop.add_timeout(timedelta(seconds=0.01), g)
def g():
result.append(None)
loop.stop()
loop.add_callback(f)
loop.start()
assert result == [None]
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
See More Examples