2010-05-28 133 views
8

我有类似如下的观点:流HTTP响应,刷新浏览器

from django.views.decorators.http import condition 

def stream(): 
    for i in range(0, 40): 
     yield " " * 1024 
     yield "%d" % i 
     time.sleep(1) 

@condition(etag_func=None): 
def view(request): 
    return HttpResponse(stream(), mimetype='text/html') 

但是,它肯定似乎并没有在所有被流。所有的数据都会在大约40秒后立即被转储。我如何才能正确刷新?

+1

相关:http://stackoverflow.com/questions/2922874/how-to-stream-an-httpresponse-with-django – miku 2010-05-28 22:36:06

+0

是的,这就是我得到的代码想法尝试,但是,它似乎并不为我工作。不知道我在这里做错了什么。 – synic 2010-05-28 22:47:16

+0

你正在做的事情完全不是标准的,只是由于某些浏览器实现http的细节而发生的奇迹。我会说,尝试一堆浏览器和不同数量的空白。最终,你可能会发现一个可远程利用的安全漏洞。 – 2010-06-04 07:58:53

回答

3

要使http流正​​常工作,您的中间件,WSGI容器和Web服务器(以及反向代理/负载平衡器,如果您使用nginx + apache2 syle部署)都必须支持它。禁用中间件并删除一些图层,直到它工作(缓存或设置etags的任何内容都没有了),然后将它们添加回去。我不知道你有什么堆栈,但是IIRC apache2 + mod_python对于流式处理是可以的,尽管这不是推荐Django服务的方式。

+1

谢谢!这帮助了我。在nginx的情况下,我需要'proxy_buffering off';'。 – d33tah 2015-10-30 19:53:32