0


1

数秒ごとにHttpResponseを更新する

Djangoの私のアプリケーションは、いくつかの*非常に*大きなSQLクエリを作成できます。 現在、必要なデータに「HttpRequest」オブジェクトを使用し、次に「HttpResponse」を使用して、ユーザーに表示するものを返します。

明らかに、これらの多くのクエリセットが実行されてデータベースから抽出されている間、ユーザーに1分間待機させてから、このモノロシックなHTMLページを返すことができます。

理想的には、次のようなページを更新したいです。

For i,e in enumerate(example):

    Table.objects.filter(someObjectForFilter[i]).

    #Return the object to the page.
    #Then Loop again, 'updating' the response after each iteration.

これは可能ですか?

2 回答


4


私は最近、HttpResponseがジェネレーターになり得ることを発見しました。

def myview(request, params):
    return HttpResponse(mygenerator(params))


def mygenerator(params):
    for i,e in enumerate(params):
        yield '%s' % Table.objects.filter(someObjectForFilter[i])

これにより、「mygenerator」の結果がページに徐々に返され、HTMLでラップされます

表示用。


2


あなたのアプローチには少し欠陥があります。 いくつかの選択肢があります。

最初の方法がおそらく最も簡単です-AJAXとHTTPRequestを使用します。 これらのシリーズがあり、それぞれが単一の `Table.objects.filter(someObjectForFilter [i])。`になります。 それぞれが終了すると、スクリプトは完了し、結果をクライアントに返します。 クライアントはUIを更新し、別のAJAX呼び出しを介して次のクエリを開始します。

別の方法は、バッチシステムを使用することです。 これは少し手間がかかりますが、データベースで実際に「重い作業」を行う場合は、おそらくより良い設計です。 着信タスクをスキャンするバッチデーモンを実行する必要があります(これにはcronプローブが正常に機能します)。 ユーザーは何かを実行したいので、リクエストはこのタスクをサブミットします(それは単に、パラメーターを持つデータベース内の行である可能性があります)。 デーモンはそれを取得し、おそらく別のマシンでさえも完全にオフラインで処理し、結果が完了したらタスク行を更新します。 クライアントは、従来の方法またはAJAXメソッドを使用して、定期的に更新してその行のステータスを確認できます。