2011-07-14 46 views
5

私はDjangoアプリで長時間のポーリングを使用して、長時間の操作に関するステータスメッセージをクライアントに返します。これは、文字列を返すイテレータで初期化されたビュー関数でHttpResponseオブジェクトを返すことで行います。これはすべてうまくいくが、反復子関数は状態メッセージを返すために何トンもの歩留まりでかなり長くなっている。Djangoのロングポーリング

長い操作を複数の関数に分割し、それぞれが独自のステータスメッセージを返すようにすることで、これをよりうまく設計したいと考えています。しかし、私はこれを行う方法を見ることができません。

def my_long_operation(): 
    do_something() 
    yield "Did something" 
    do_something_else() 
    yield "Did something else" 

...と私が持っているしたいと思います:つまり、私はこれを持っている

def do_something(): 
    do_first_part_of_something() 
    yield "Did first part of something" 
    do_second_part_of_something() 
    yield "Did second party of something" 

def do_something_else(): 
    do_first_part_of_something_else() 
    yield "Did first part of something else" 
    do_second_part_of_something_else() 
    yield "Did second party of something else" 

def my_long_operation(): 
    do_something() 
    do_something_else() 

がに値を得るために、第二の例では収量を得るためにいくつかの方法がありますイテレータの呼び出し元?そうでない場合、より良いアプローチがありますか?私はWebSocketを見ましたが、まだ完全にベークされていないようです(特にブラウザのサポートの点で)。私はまた、サーバーの実際のポーリングを考慮しましたが、それははるかに複雑なので、私は可能な限りオープンな接続とストリームメッセージを維持し続けたいと思います。

+0

が私を義務付ける..しかし、どのようにあなたがこれを使用することを期待しますし、このために働きますか? – arustgi

+0

一言で言えば、HttpResponse(my_long_operation()、mimetype = "text/plain")を使用してレスポンスオブジェクトを作成し、HTMLテンプレートでreadyStateChangeリスナをリクエストに添付して、ready状態が変わるたびに新しいデータでHTMLを更新します。 –

+0

FWIW、IMHO長いポーリングは実装するのに苦労する可能性があります。あるシナリオが望ましいが、より頻繁ではないが、一意のIDを即座に返信し、ステータスをポーリングするためのURLを提供する方が実装がはるかに簡単である。状態を保持するためにDbまたはシングルトンを使用している場合は、これは素晴らしいことです。もちろん、長いポーリングが完璧な仕組みなので、これをゴスペルにしないでください – Basic

答えて

3

試してみてください。

import itertools 

def my_long_operation(): 
    return itertools.chain(do_something(), do_something_else()) 
関連する問題