2010-05-28 9 views
8

Ich habe eine Ansicht wie die folgenden bekommen:Streaming HTTP-Antwort, an den Browser Spülung

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

es aber auf jeden Fall nicht zu Streaming zu sein scheint. Alle Daten werden am Ende nach etwa 40 Sekunden auf einmal ausgegeben. Wie kann ich es richtig spülen lassen?

+1

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

+0

Ja, das ist, wo ich die Code-Ideen zu versuchen, aber es scheint nicht für mich arbeiten. Ich bin mir nicht sicher, was ich hier falsch mache. – synic

+0

Was Sie tun, ist völlig nicht Standard und nur ein Wunder, dass aufgrund der Details, wie einige Browser http implementieren. Ich würde sagen, versuchen Sie es mit einer Reihe von Browsern und unterschiedlichen Mengen an Leerzeichen. Schließlich werden Sie wahrscheinlich eine remote ausnutzbare Sicherheitslücke finden. –

Antwort

3

Damit HTTP-Streaming funktioniert, müssen Ihre Middleware, WSGI-Container und Webserver (sowie der Reverse-Proxy/Load-Balancer, wenn Sie eine nginx + apache2 syle-Bereitstellung verwenden) dies unterstützen. Deaktivieren Sie die Middleware und entfernen Sie einige der Ebenen, bis sie funktioniert (alles, das Caching durchführt oder Etags setzt, ist deaktiviert), und fügen Sie sie dann wieder hinzu. Ich weiß nicht, welchen Stack du hast, aber IIRC apache2 + mod_python ist OK beim Streamen, obwohl es nicht die empfohlene Art ist, Django zu bedienen.

+1

Danke! Das hat mir geholfen. Im Fall von nginx brauchte ich 'proxy_buffering off;'. – d33tah

Verwandte Themen