2010-05-28 9 views
8

tengo una vista como la siguiente:Transmisión de respuesta HTTP, rubor al navegador

from django.views.decorators.http import condition 

def stream(): 
    for i in range(0, 40): 
     yield " " * 1024 
     yield "%d" % i 
     time.sleep(1) 

@condition(etag_func=None): 
def view(request): 
    return HttpResponse(stream(), mimetype='text/html') 

Sin embargo, definitivamente no parece ser la transmisión en absoluto. Todos los datos se vuelcan a la vez, al final, después de unos 40 segundos. ¿Cómo puedo hacer que se descargue correctamente?

+1

relacionado: http://stackoverflow.com/questions/2922874/how-to-stream-an-httpresponse-with-django – miku

+0

Sí, ahí es donde obtuve las ideas del código para probar, sin embargo, no parece estar trabajando para mi No estoy seguro de lo que estoy haciendo mal aquí. – synic

+0

Lo que estás haciendo no es completamente estándar y solo ocurre un milagro debido a los detalles de cómo algunos navegadores implementan http. Yo diría, pruébelo con un montón de navegadores y cantidades variables de espacios en blanco. Eventualmente, probablemente encontrará un agujero de seguridad remotamente explotable. –

Respuesta

3

Para hacer que la transmisión http funcione, su middleware, contenedor WSGI y servidor web (así como el proxy inverso/equilibrador de carga si utiliza una implementación syg nginx + apache2) tienen que admitirlo. Desactive el middleware y elimine algunas de las capas hasta que funcione (todo lo que hace el almacenamiento en caché o establezca etags está fuera), luego agréguelos de nuevo. No sé qué stack tienes, pero IIRC apache2 + mod_python está bien con la transmisión, aunque no es la forma recomendada de servir a Django.

+1

Gracias! Esto me ayudó. En el caso de nginx, necesitaba 'proxy_buffering off;'. – d33tah

Cuestiones relacionadas