Gran parte del middleware django evitará la transmisión de contenido. Gran parte de este middleware debe estar habilitado si desea utilizar la aplicación de administración django, por lo que puede ser una molestia. Afortunadamente, esto se resolvió en el django 1.5 release. Puede usar el StreamingHttpResponse para indicar que desea transmitir los resultados de vuelta y todo el middleware que se envía con django es consciente de esto y actúa en consecuencia para no almacenar en búfer el resultado de su contenido, sino que lo envía directamente al final de la línea. Su código se vería así para usar el nuevo objeto StreamingHttpResponse.
def stream_response(request):
return StreamingHttpResponse(stream_response_generator())
def stream_response_generator():
for x in range(1,11):
yield "%s\n" % x # Returns a chunk of the response to the browser
time.sleep(1)
Nota sobre Apache
I probado lo anterior en Apache 2.2 con Ubuntu 13.04. El módulo apache mod_deflate, que estaba habilitado de forma predeterminada en la configuración que probé, almacenará en búfer el contenido que está intentando transmitir hasta que alcance un determinado tamaño de bloque, luego comprimirá gzip el contenido y lo enviará al navegador. Esto evitará que el ejemplo anterior funcione como se desee. Una forma de evitar esto es desactivar mod_deflate poniendo la siguiente línea en su configuración de Apache:
SetEnvIf Request_URI ^/mysite no-gzip=1
Esto se discute más en la cuestión How to disable mod_deflate in apache2?.
@Tomasz: la especificación del protocolo WSGI http://www.python.org/dev/peps/pep-0333/ –