Я сделал большую сложную приборную панель Bokeh.Я не определил никаких шаблонов HTML для панели инструментов.Я просто обслужил его, используя приведенный ниже код.
Моя проблема в том, что панель управления выглядела очень хорошо при использовании функции bokeh.plotting.output_notebook
для встраивания ее в блокнот Jupyter.Теперь, когда вы пытаетесь создать и обслуживать панель мониторинга за пределами Jupyter, она выглядит намного ужаснее, потому что там нет некоторых таблиц стилей, которые отображают красивые таблицы.У меня вопрос, как мне добавить внешние таблицы стилей в мое веб-приложение bokeh.
Код панели инструментов:
def emb_bokehdash(self, doc, dash_width=1500, dash_height=800):
# Get base data:
df_orig = self._get_base_data_for_vis(unlabeled_name)
unique_labels = list(df_orig.label.unique())
...
# Sentence Selection Controls:
index_text = AutocompleteInput(
title="select sentence index", value=str(candidate_state),
completions=list(df_orig.index.map(lambda idx: str(idx))),
width=control_width
)
index_next = Button(label="next", button_type="primary", width=button_width)
index_back = Button(label="back", button_type="primary", width=button_width)
selection_checkboxes = CheckboxGroup(labels=['unseen', 'random'], active=[])
index_input = row(
widgetbox(index_text, width=control_width+200),
widgetbox(index_next, index_back, width=button_width+40),
selection_checkboxes,
width=info_width
)
... More code defining DOM and wrangling data
layout_ = row(inputs_and_info, plot, height=dash_height)
# initial load of the data
update_selectioninfo_and_plot()
update_selected_info()
# Register title and dashboard with the document:
doc.title = "Smart Feedback Labeler"
doc.add_root(layout_)
Код сервера панели инструментов:
from bokeh.server.server import Server
from os import getpid
def emb_bokehdash_serve(self, **server_kwargs):
# Route App:
apps = {'/': Application(FunctionHandler(self.bokeh_dashboard))}
# Extract Port (default = 5000):
if "port" not in server_kwargs:
server_kwargs["port"] = 5000
# Find a suitable port to use:
while True:
try:
server = Server(apps, **server_kwargs)
except OSError:
self.logger.info(
f"Port {server_kwargs['port']} already in use, serving to port {server_kwargs['port']+1}"
)
server_kwargs["port"] += 1
else:
break
# We have to defer opening in browser until we start up the server
def show_callback():
for route in apps.keys():
server.show(route)
server.io_loop.add_callback(show_callback)
# Set server address (default is localhost):
address_string = 'localhost'
if server.address is not None and server.address != '':
address_string = server.address
for route in sorted(apps.keys()):
url = "http://%s:%d%s%s" % (address_string, server.port, server.prefix, route)
self.logger.info("Bokeh app running at: %s" % url)
self.logger.info("Starting Bokeh server with process id: %d" % getpid())
if not run_from_ipython():
server.run_until_shutdown() # Doesn't shutdown properly when run from Jupyter Notebook.
else:
server.start()
Обратите внимание, я не могу запустить эту панель статически.