Django - 持续发送输出

时间:2009-10-26 10:46:03

标签: django

我想从django视图开始处理一些文件,我希望能够在处理文件时将文件名发送到浏览器。有没有办法(轻松)这样做?我可以使用线程和ajax调用来做到这一点,但我现在想要最简单的解决方案。

5 个答案:

答案 0 :(得分:6)

我从{em> Andre Miller 提供的链接中找到了answer所需的内容。

我发现可以将迭代器传递给HttpResponse,所以我使用了这段代码并且工作正常:

def import_iter():
    """ Used to return output as it is generated """
    # First return the template
    t = loader.get_template('main/qimport.htm')
    c = Context()
    yield t.render(c)
    # Now process the files
    if req.method == 'POST':
        location = req.POST['location']
        if location:
            for finfo in import_location(location):
                yield finfo+"<br/>"

return HttpResponse(import_iter())

答案 1 :(得分:2)

如果要在呈现视图时启动任务,则需要使用某种排队过程,否则在将任何内容返回到浏览器之前,该过程将首先完成。

一旦任务以异步方式运行,您可以使用AJAX更新具有最新状态的页面,或者只是使用页面内的元刷新来加载新内容。

您可以使用Django队列服务器:

http://code.google.com/p/django-queue-service/

这个问题似乎也曾被问过几次:

答案 2 :(得分:0)

如果您清除output buffer,那么您应该能够看到已处理的内容。

答案 3 :(得分:0)

我们在201X

是的,您应该使用WebSockets或Ajax调用!!

由于您在Django中询问(用于记录目的)某些流式传输解决方案,因此您可以使用Django支持的StreamingHttpResponse

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.StreamingHttpResponse

StreamingHttpResponse类用于将Django的响应流式传输到浏览器。如果生成响应时间过长或占用太多内存,则可能需要执行此操作。例如,它对生成大型CSV文件很有用。

答案 4 :(得分:-2)

首先,确保输出Connection: Keep-Alive标头,之后您必须确保脚本输出没有被缓冲。在Python中,您可以使用cgi模块的cgiprint函数来确保清除Python的缓冲区,但您还应检查Web服务器配置,因为有些将缓冲所有输出,直到脚本完成运行。 / p>