Обновление данных на стороне клиента Bokeh с помощью веб-сокета каналов Django - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь обновить график Bokeh в Django, когда новые данные поступают через веб-сокет, реализованный с помощью каналов Django.Целью является потоковая передача новых данных, полученных через веб-сокет, без обновления браузера.

My Представление django Создание графика боке :

#in views.py
def sensor(request):
    plot = figure(title= 'title' ,
        x_axis_label= 'X-Axis',
        y_axis_label= 'Y-Axis',
        plot_width =900,
        plot_height =500

    source = ColumnDataSource(data=dict(x=[], y=[]))
    plot.line('x', 'y', source=source, legend= 'f(x)', line_width = 2)

    script, div = components(plot)

    return render(request,"sensor.html",{'div':div,'script':script})

JQuery , связанный с websocket , выглядит следующим образом (я получаю сообщение в виде текста в формате JSON):

//In a script tag in sensor.html
$(function() {
  var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws";
  var endpoint = ws_scheme + '://' + window.location.host + window.location.pathname
  var ws = new WebSocket(endpoint);

  ws.onopen = function(e) {
         console.log("open", e);
  };

  ws.onmessage = function(e) {
      console.log("message", e);
      var new_data = jQuery.parseJSON(e.data).data);

      // UPDATE BOKEH ColumnDataSource WITH new_data 

  };
});

Моя проблема в том, что японятия не имею, как обновить Bokeh ColumnDataSource через JQuery.Самое близкое, что я нашел, - это использование Bokeh CustomJS Callbacks , но я не вижу способа связать их с событием onmessage websocket и получить доступ к данным, собранным с помощью этого события.

Другойя попробовал встроить отдельный сервер Bokeh , но я не могу найти способ обновления графиков с помощью моих веб-сокетов Django Channels.Я также должен был бы передавать данные из моих моделей Django на сервер Bokeh при инициализации графиков, что неудобно.

И помощь / совет будет принята с благодарностью.Спасибо

1 Ответ

0 голосов
/ 13 февраля 2019

Насколько мне известно, вы чуть ли не первый человек, который предложил или спросил об этом [1].Боюсь, в настоящее время нет хорошего ответа для вас.Протокол Bokeh четко определен и изолирован, поэтому в принципе его можно использовать для связи по любому подходящему каналу, но в настоящее время его используют только:

  • Стандартсервер Bokeh на основе Tornado по умолчанию, который создает и управляет своими собственными соединениями веб-сокетов

  • Расширения Jupyter, которые используют Jupyter comms для отправки сообщений.

Использование каналов Django означало бы повторную реализацию некоторого подмножества (или всего) текущего сервера Tornado Bokeh поверх Django.Это также может потребовать внесения изменений в сам BokehJS.В любом случае это определенно нетривиальная сфера, то есть я бы оценил, по крайней мере, несколько недель работы для человека, который уже имел большой опыт работы с внутренностями Боке.

Я был бы рад попытаться обсудить более подробную информацию, особенно в том, что касается вашего варианта использования.Возможно, у вас есть упрощающие предположения, которые могут сделать возможными альтернативные варианты (например, если вам когда-либо нужно передать данные на графики боке, и вам не нужна двусторонняя синхронизация, которую предоставляет сервер Bokeh, товозможно, вы могли бы создать свой собственный простой протокол).Но такого рода итеративное обсуждение лучше для публичной рассылки , чем для SO.

[1] Коммерческий клиент недавно также спросил о каналах и может даже продолжить финансируемую работу, чтобы добавить эту возможность, но у меня нет возможности спекулировать, когда это произойдет.

...