python - Django 返回 http 早期刷新(分块响应)

标签 python django http chunked-encoding http-chunked

我有一个等待将近 5 秒来生成响应的算法,我想在他发送请求后立即向用户发送一个确认 (http 200),告诉他他的请求已收到并等待 5 秒。

生成器函数:

def chunked_res():
    yield "Chunk 1"

    stop = time.time() + 5    # wait for 5 seconds
    while time.time() < stop:
        pass

    yield "Chunk 2"

在某些观点中:

response = HttpResponse ( chunked_res() )
response['Connection'] = 'close'
response['Transfer-Encoding'] = 'chunked'
response['status'] = 200
return response

在浏览器中的响应:

“传输编码:分块\n状态:200\n连接:关闭\n内容类型:文本/html;字符集=utf-8\n\n block 1 block 2”

问题: 我得到所需的响应( block 1, block 2),但在 5 秒后。我想先发送“Chunk 1”,然后在 5 秒后发送“Chunk 2”(更新响应)。是否有任何特定的设置/更改来实现此目的?

更新:

Django = 1.4 python = 2.7

最佳答案

实际上,解决方案是使第一个 block 大小至少为 1024 个字符,以便浏览器递增显示。

How to stream an HttpResponse with Django

def chunked_res():
    yield "Chunk 1"
    yield " " * 1024  # Encourage browser to render incrementally (either 1024 or 1024-7{length of "chunk 1"} = 1017)

    time.sleep(5)  # wait for 5 seconds

    yield "Chunk 2"


def myview(request):
    g = chunked_res()
    return HttpResponse(g)

如果您使用的是 nginx,那么您必须设置 proxy_buffering=off,以便服务器在 1024 数据 block 准备就绪时刷新响应。 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size

适用于: HTTP/1.0 和 HTTP/1.1

关于python - Django 返回 http 早期刷新(分块响应),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15471103/

相关文章:

Python Pandas DataFrame to_csv 奇怪的格式

python遍历列表

python - YALV(又一个循环矢量化)

python 形式

python - 如何在请求 python 库中限制 HTTP 请求的下载速率?

python - 如何在单击按钮时更改 flask babel 的语言?

Django 静态文件在 Microsoft Azure 中生成后出现 404 错误

php - HTTP POST 请求通过 PROXY php

ruby - 使用 Ruby 的 Net :HTTP 在 HTTP header 中保留大小写

python - 使用 DateTime 字段保存 Django 模型