2011-07-14 23 views
5

Django uygulamasında, uzun bir işlemle ilgili durum iletilerini ilerledikçe istemciye döndürmek için bir tür uzun yoklama kullanıyorum. Bunu, bir HttpResponse nesnesini, görünümlerimde, dizeleri döndüren bir yineleyici ile başlatılan bir döndürme döndürerek yapıyorum. Tüm bunlar harika çalışıyor, ancak yineleyici işlevi, durum mesajlarını döndürmek için tonlarca verim alıyor.Django'da uzun yoklama

Uzun işlemi, her biri kendi durum iletilerini döndüren birden çok işleve ayırarak bunu daha iyi bir şekilde tasarlamak istiyorum. Ama bunu yapmanın bir yolunu göremiyorum.

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

... ve sahip olmak istiyorum: Başka bir deyişle, bu var

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

değerleri elde etmek için ikinci örnekteki verim almak için bazı yolu var mı yineleyici arayan? Yoksa, daha iyi bir yaklaşım var mı? WebSockets'a baktım ama henüz tamamen pişirilmemiş gibi görünüyor (özellikle tarayıcı desteği açısından). Ayrıca sunucunun gerçek seçimini de düşündüm ama bu çok daha karmaşık olacak, bu yüzden açık bağlantıyı ve yayın mesajlarını mümkünse devam ettirmeye devam etmek istiyorum.

+0

mecbur .. ama nasıl bu kullanmayı bekliyorsunuz ve bunun için çalışmak? – arustgi

+0

Özetle, HttpResponse (my_long_operation(), mimetype = "text/plain") kullanarak yanıt neslim oluşturuyorum ve HTML şablonunda isteğe hazır bir ReadyStateChange dinleyicisi ekliyorum ve hazır durum değiştiğinde HTML'yi yeni verilerle güncelliyorum . –

+0

FWIW, IMHO uzun yoklama uygulamak için bir ağrı olabilir. İstenirse ancak çoğu zaman benzersiz bir Kimliği döndüren ve statü için bir anketi uygulamaya koymak için bir url sağlayan belirli bir senaryo vardır. Durumu korumak için Db veya singleton kullanıyorsanız bu harikadır. Elbette, uzun yoklamanın mükemmel mekanizma olduğu durumlar var, bu yüzden bunu gospel olarak almayın – Basic

cevap

3

Dene:

import itertools 

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