如何用Django流式传输HttpResponse?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (39)

我想获得适用于Django(1.2)的流式响应的'hello world'。我想出了如何使用生成器和yield函数。但是响应仍然没有流式传输。我怀疑是否有一个中间件正在使用它 - 也许ETAG计算器?但我不知道如何禁用。

这是迄今为止流式传输的“hello world”:

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命令行工具来确认。但它可能不足以让浏览器在流式传输中显示响应。为了鼓励浏览器在流式传输时显示响应,可以向管道中推送一堆空白,以强制其缓冲区填充。示例如下:

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"
用户回答回答于

可以使用StreamingHttpResponse来表明想要将结果进行流式传输。然后,你的代码将如下所示使用新的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)

扫码关注云+社区