使用Django通道websocket更新Bokeh plot客户端中的数据



当通过Django Channels实现的websocket接收到新数据时,我正在尝试更新Django中的Bokeh图。其目的是在不刷新浏览器的情况下,对通过网络套接字接收到的新数据进行流式传输。

我的django视图创建bokeh图是:

#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})

websocket关联的JQuery如下(我以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 
};
});

我的问题是,我不知道如何通过JQuery更新Bokeh ColumnDataSource。我发现最接近的是使用Bokeh CustomJS回调,但我看不出有任何方法可以将它们与websocket-onmessage事件连接起来,并访问通过该事件收集的数据。

我尝试过的另一个选项是嵌入一个单独的Bokeh服务器,但我找不到使用Django Channels websockets更新情节的方法。在初始化绘图时,我还必须将数据从Django模型传递到Bokeh服务器,这很不方便。

如能提供协助/建议,不胜感激。谢谢

据我所知,你几乎是第一个提出或询问此事的人[1]。恐怕目前还没有一个好的答案。Bokeh协议定义明确且独立,因此原则上它可以用于通过任何合适的信道进行通信,但目前唯一使用它的是:

  • 基于Tornado的标准默认Bokeh服务器,它创建并管理自己的websocket连接

  • Jupyter扩展,使用Jupyter命令发送消息。

使用Django通道意味着在Django之上重新实现当前Tornado Bokeh服务器的部分(或全部)。它可能还需要对BokehJS本身进行更改。无论如何,这肯定是不平凡的,也就是说,我估计对于一个已经对Bokeh内部有很多经验的人来说,至少要工作几周。

我很乐意尝试讨论更多的细节,特别是与您的用例相关的细节。你可能有简化的假设,这可能会使其他选择成为可能(例如,如果你只需要数据推送到散焦图,而不需要散焦服务器提供的双向同步,那么你可能会想出自己的简单协议)。但是这种迭代讨论对于公共邮件列表比SO更好

[1]一位商业客户最近也询问了Channels的情况,甚至可能会寻求资金支持来增加这一功能,但我无法推测这何时或是否真的会发生

最新更新