web-dev-qa-db-ja.com

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

Webページでタイマーを使用して今のデータを要求するのは良い習慣ですか?

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

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

どうもありがとう。

14

私の意見では、フロントエンドでハートビートタイマーのようなものを使用して、1秒ごとにデータフェッチをトリガーすることは問題ありません。特に、バックエンドにキャッシュを実装した場合。

より洗練されたバージョンでは、 Djangoチャネル のようなものを使用してWebソケットを介した通信を処理できます。

プロジェクトの成熟度次第だと思います。

4
t_io

基本的に、ここでの問題は、ブラウザーが要求/応答パターンを使用することです。ブラウザーは要求を送信し、すぐに応答を返します。サーバーを定期的にポーリングするか、ある種の通知システムを使用するかの2つのオプションがあります。

通知は ロングポーリング、つまりクライアントがリクエストを行い、サーバーはデータが存在するまで、WebSocketまたはHTML5サーバー側イベントを介して応答しない である可能性があります。

さて、これらの通知システムは、従来のDjangoデプロイメントとうまく統合されていません。これは、ソケットが開いて対応するスレッドがハングするためです。したがって、Webサーバーに10 = Djangoスレッド、10個のタブを持つ1つのブラウザーは、それらすべてを拘束する可能性があります。

これを変更する作業が進行中ですが、それまでの間、厳しいリアルタイム要件や多数のクライアントがない限り、タイマーを設定してx秒ごとにポーリングします。xは許容可能なレイテンシによって異なります。データの保存方法にもよりますが、サーバーがデータセット全体を毎回送信するのではなく、新しいものか何も変更されていないリターンコードのいずれかのみを送信するように、単純なメカニズムを導入するでしょう。

たとえば、最初の要求で、サーバーは応答にタイムスタンプまたはシリアル番号を入力し、クライアントはそのタイムスタンプ/シリアル番号以降の変更を要求する場合があります。

通知システムを使用すると、オーバーヘッドが少なくなり、レイテンシが向上しますが、デプロイがより困難になる可能性があり、これが単なる内部使用のアプリである場合は、おそらくやり過ぎになります。通知システムを使用する場合でも、何かを見逃さないように、注意深いプロトコル設計を行う必要があります。

4
olau

このようなものが私のために働いた:

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

次に、ボケサーバーでsource.stream()を使用します

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

次に、ボケサーバーを起動し、Django like

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

ポート8000​​を使用したのはそれが私のDjangoポートであり、views.pyのポート5006が私の竜巻ポートであるためです。

クラスを確認してください columndatasource 詳細については

それが役に立てば幸い。

1
Kiluvya.A