2016-04-24 77 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希望它能幫助。

相關問題