Еще через несколько дней я нашел питонический (или бокеонный) способ делать то, что мне нужно: решение заключается в том, чтобы «давать имена объектам» на стороне сервера bokeh.И запрашивая доступ к этим объектам by_name на стороне клиента.
Упрощенный пример на стороне сервера выглядит следующим образом:
from bokeh.plotting import figure, curdoc
from bokeh.layouts import gridplot
from bokeh.models import ColumnDataSource
import numpy as np
x = np.zeros(2)
y = np.zeros(2)
v_src = ColumnDataSource(data=dict(x=x, y=y))
fig_v = figure(plot_width=600, plot_height=300)
fig_v.y_range.name = "y_range_v" # *** giving a name
fig_v.line('x','y',source=v_src, line_width=2,name="voltage") # *** giving a name
plot = gridplot([[fig_v],], toolbar_location='above')
curdoc().add_root(plot)
Теперь я могу, например, получить доступ к объекту fig_v.line с его атрибутами и/ или объект fig_v.yrange через сеанс pull на стороне клиента (flask) и измените его, например:
with pull_session(session_id=None, url='http://192.168.3.1:5000/bk_serv') as session:
script = server_session(session_id=session.id,url='http://192.168.3.1:5000/bk_serv')
doc = session.document
line = doc.get_model_by_name("voltage") # *** access via name
line.data_source.data = dict(x=np.arange(len(some_x_data)), y=some_y_data)
yrange = doc.get_model_by_name("y_range_v") # *** access via name
yrange.start=min_somedata
yrange.end = max_somedata
return render_template('flask.html', form=form, script=script)
Я не уверен в деталях, но соединение через веб-сокет, созданное bokeh, требуетзабота об обновлении сюжета.
Примечание: приведенный выше код является выдержкой из кода, который я написал.Он может не работать как есть, но я не могу опубликовать всю работу, и этот отрывок дает важную информацию.