我正在尝试获得适用于Django(1.2)的流响应的“ hello world”。我弄清楚了如何使用生成器和yield函数。但是响应仍然没有流式传输。我怀疑其中有一个中间件-也许是ETAG计算器?但是我不确定如何禁用它。有人可以帮忙吗?
yield
到目前为止,这是我迄今为止所拥有的流媒体“世界”:
def stream_response(request): resp = HttpResponse( stream_response_generator()) return resp 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)
你可以使用条件装饰器禁用ETAG中间件。这将使你的响应通过HTTP流回。你可以使用命令行工具(如)进行确认curl。但这可能不足以让你的浏览器在流式传输时显示响应。为了鼓励浏览器在流式传输时显示响应,可以在管道中向下推动一堆空白以强制其缓冲区填充。示例如下:
curl
from django.views.decorators.http import condition @condition(etag_func=None) def stream_response(request): resp = HttpResponse( stream_response_generator(), content_type='text/html') return resp def stream_response_generator(): yield "<html><body>\n" for x in range(1,11): yield "<div>%s</div>\n" % x yield " " * 1024 # Encourage browser to render incrementally time.sleep(1) yield "</body></html>\n"