2011-07-14 26 views
5

Estoy utilizando una especie de larga encuesta en mi aplicación Django para devolver mensajes de estado sobre una operación larga al cliente a medida que avanza. Lo hago devolviendo un objeto HttpResponse en mi función de vista que se inicializa con un iterador que devuelve cadenas. Todo esto funciona muy bien, pero la función de iterador es bastante larga con toneladas de rendimiento para devolver los mensajes de estado.Encuesta larga en Django

Me gustaría diseñar esto mejor al dividir la operación larga en varias funciones, cada una de las cuales devuelve sus propios mensajes de estado. Pero no puedo ver una manera de hacer esto. En otras palabras, tengo esto:

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

... y me gustaría tener:

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

¿Hay alguna manera de obtener los rendimientos en el segundo ejemplo para obtener los valores de la llamador de iterador? Si no, ¿hay un mejor enfoque? Miré WebSockets pero parece que todavía no está completamente cocido (especialmente en términos de compatibilidad con el navegador). También consideré el sondeo real del servidor, pero será mucho más complejo, por lo que me gustaría continuar manteniendo la conexión abierta y transmitir los mensajes, si es posible.

+0

me obligan .. pero ¿qué se puede esperar de usar esto y para que esto funcione? – arustgi

+0

En pocas palabras, creo mi objeto de respuesta usando HttpResponse (my_long_operation(), mimetype = "text/plain") y en la plantilla HTML adjunto un listener readyStateChange a la solicitud y actualizo el HTML con nuevos datos siempre que el estado listo cambie . –

+0

FWIW, la votación a largo plazo en mi humilde opinión puede ser difícil de implementar. Hay ciertos escenarios en los que es deseable, pero la mayoría de las veces, devolver un identificador único de inmediato y proporcionar una url a la encuesta para el estado es mucho más simple de implementar. Esto es genial si está usando un Db o Singleton para preservar el estado. Por supuesto, hay situaciones en las que el sondeo largo es el mecanismo perfecto, así que no lo tomes como un evangelio – Basic

Respuesta

3

Probar:

import itertools 

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