我有一个等待将近 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/