2016-04-24 324 views
12

我有一个嵌入在Django应用程序中的散景图。我在django视图中创建情节,并将情节推送到散景服务器以在我的网页中显示情节。利用django和景绘制实时数据的正确方法

#view.py 
def view_plot(request): 
    f=figure() 
    f.plot(#some data#) 
    session = push_session(curdoc()) 
    context = {'script': autoload_server(f, session_id=session.id)} 
    return render_to_response('plot.html', context=context) 

这一切都很好。现在我想要做一个现场情节,每次创建新的DB-Entry时,情节都应该更新。我不知道什么是最好的方法。

在网页上使用计时器来请求现在的数据是否是一种很好的做法?

或者有没有办法从服务器上推送更新,以便每个当前连接的客户端都能获得剧情更新?

我会非常感谢每一个提示。

非常感谢。

回答

2

在我的意见中,可以在你的前端使用类似心跳计时器的东西,每隔一秒左右触发一次数据提取。特别是如果你在后端实现缓存。

一个更复杂的版本可以使用类似django channels 通过网络插座来处理通信。

我想说这取决于项目的成熟度。

4

基本上你的问题在于浏览器使用请求 - 响应模式:他们发送请求,然后立即取回答案。您有两种选择,定期轮询服务器或某种通知系统。

通知可能是long-polling, i.e. client makes a request and server doesn't respond until there's data, or through websockets or through HTML5 server-side events

现在,事情是这些通知系统不能很好地与传统的Django部署集成,因为它们导致了一个开放的套接字和相应的挂起线程。所以如果你的网络服务器有10个Django线程,一个带有10个标签的浏览器可以捆绑所有这些线程。

工作正在进行,以改变这种情况,但同时,除非您有硬实时需求或大量客户端,否则只需设置一个计时器并每隔x秒轮询一次,其中x取决于可接受的等待时间。根据数据的存储方式,我可能会放入一个简单的机制,以便服务器不会每次都发送整个数据集,但只能是新的或不带任何更改的返回码。

例如,在第一个请求上,服务器可能会在响应中输入时间戳或序列号,然后客户端会要求自该时间戳/序列号以来发生的任何更改。

通知系统以较低的开销为您提供更好的延迟,但它可能也会更难以部署,如果这只是一个内部使用的应用程序,可能会过度。即使使用通知系统,您也需要进行一些仔细的协议设计,以确保不会错过任何内容。

1

事情是这样的工作对我来说:

#views.py 
from bokeh.plotting import figure, curdoc 
from bokeh.client import pull_session 

def my_line_chart(request): 
    session = pull_session(url = "http://localhost:5006/myapp") 
    bokeh_script=autoload_server(None,url = "http://localhost:5006/myapp", session_id= session.id) 
    return render(request, u'line_charts.html', {u'the_script': bokeh_script}) 

然后在你的背景虚化的服务器使用源。流()

#myapp 
    ''' 
    everything else here 
    ''' 
    def update(): 
     new_data = qu() #qu is the newdata to be updated 
     source.stream(new_data, rollover = 60) 
     print(source.data) #if you want to see new data 

    curdoc().add_root(p) 
    curdoc().add_periodic_callback(update,10000) 

然后开始你的背景虚化的服务器,并允许像

bokeh serve --allow-websocket-origin=127.0.0.1:8000 myapp.py #you can add app2.py too 

我用8000端口从Django的连接,因为这是我的Django的端口,并在views.py端口5006,因为它是我的龙卷风口岸。

检查更

columndatasource希望它能帮助。

相关问题