2011-07-14 70 views
5

我在我的Django應用程序中使用了一種長查詢來向客戶端返回關於長操作的狀態消息。我通過在我的視圖函數中返回HttpResponse對象來完成此操作,該對象使用返回字符串的迭代器進行初始化。這一切都很好,但迭代器函數變得很長,並且有大量的yield返回狀態消息。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() 

是否有某種方式來獲得在第二個例子中的收益率產生值的迭代器的調用者?如果沒有,是否有更好的方法?我看着WebSockets,但它似乎還沒有完全被烘焙(特別是在瀏覽器支持方面)。我也考慮過真正的服務器輪詢,但這會更加複雜,所以如果可能的話,我想繼續保持開放的連接和流消息。

+0

迫使我..但你怎麼指望用這個和這個工作? – arustgi

+0

簡而言之,我使用HttpResponse(my_long_operation(),mimetype =「text/plain」)創建我的響應對象,並在HTML模板中將readyStateChange偵聽器附加到請求,並在準備狀態更改時使用新數據更新HTML 。 –

+0

FWIW,恕我直言長投票可能是一個痛苦執行。在某些情況下,它是可取的,但通常情況下,直接返回一個唯一標識並提供一個URL來輪詢狀態要實現起來要簡單得多。如果您使用Db或單例來保存狀態,這非常棒。當然,有些情況下長時間投票是完美的機制,所以不要把它當作福音 – Basic

回答

3

嘗試:

import itertools 

def my_long_operation(): 
    return itertools.chain(do_something(), do_something_else())