2016-04-24 13 views
12

私はbozhプロットをdjangoアプリケーションに埋め込んでいます。私はdjangoビューでプロットを作成し、私のWebページにプロットを表示するためにプロットをbokehサーバーにプッシュします。djangoとbokehでライブデータをプロットする正しい方法

#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エントリが作成されるたびにプロットを更新する必要があります。私は何が最善の方法であるか分かりません。

ウェブページでタイマーを使用して今すぐデータを要求するのはよい習慣ですか?

また、現在接続されているすべてのクライアントがプロット更新を取得できるように、更新フォームをサーバーにプッシュする方法はありますか?

私はすべてのヒントに対して非常に感謝しています。

ありがとうございます。

答えて

2

私の意見では、フロントエンドにハートビートタイマーのようなものを使用して毎秒データを取得するようにしても構いません。特に、バックエンドでキャッシュを実装した場合。

より洗練されたバージョンは、ウェブソケットを介して通信を処理するためにdjango channels のようなものを使用することができます。

私はそれがプロジェクトの成熟度によって異なると言います。

4

ここでの問題は、基本的にはブラウザがリクエスト/レスポンスパターンを使用していることです。要求を送信してすぐに回答を返すことです。定期的にサーバーをポーリングするか、何らかの通知システムをポーリングする2つの方法があります。

通知は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デプロイメントとあまりうまく統合できません。あなたのWebサーバに10個のDjangoスレッドがある場合、10個のタブを持つ1つのブラウザでそれらのすべてを結びつけることができます。

これを変更する作業が進行中ですが、厳しいリアルタイム要件や多数のクライアントがない限り、タイマーを設定して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) 

それが私であるため、それは私のジャンゴポート、およびviews.pyのポート5006であるので、私はポート8000​​を使用し、あなたのボケサーバを起動し、

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

のようなジャンゴからの接続を許可しますトルネードポート。より

ため

チェッククラスcolumndatasourceは、それがお役に立てば幸いです。

関連する問題