一尘不染

如何使用Django流HttpResponse

django

我正在尝试获得适用于Django(1.2)的流响应的“ hello world”。我弄清楚了如何使用生成器和yield函数。但是响应仍然没有流式传输。我怀疑其中有一个中间件-也许是ETAG计算器?但是我不确定如何禁用它。有人可以帮忙吗?

到目前为止,这是我迄今为止所拥有的流媒体“世界”:

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)

阅读 494

收藏
2020-03-26

共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"
2020-03-26