Django - 同花顺回应?

Pao*_*ino 8 python django

我正在向Django视图发送一个AJAX请求,这可能会花费很多时间.然而,它经历了一些明确定义的步骤,因此我想向用户打印状态指示器,让它知道何时完成某件事情并继续进行下一步.

如果我使用PHP,它可能看起来像这样,使用flush函数:

do_something();
print 'Done doing something!';
flush();

do_something_else();
print 'Done doing something else!';
flush();
Run Code Online (Sandbox Code Playgroud)

我将如何与Django一起做同样的事情?查看文档,我看到HttpResponse对象有一个flush方法,但是它必须要说的是"这个方法使HttpResponse实例成为一个类似文件的对象." - 我不确定那是我想要的.我很难理解如何在Django中完成这项工作,因为我必须返回响应并且无法控制内容何时进入浏览器.

Gle*_*ard 9

大多数Web服务器(例如FCGI/SCGI)都有自己的缓冲,HTTP客户端自己做,等等.实际上以这种方式刷新数据并且客户端实际接收数据非常困难,因为它不是典型的操作.

你想要做的最接近的是将迭代器传递给HttpResponse,并在生成器中完成工作; 这样的事情:

def index(request):
    def do_work():
        step_1()
        yield "step 1 complete"
        step_2()
        yield "step 2 complete"
        step_3()
        yield "step 3 complete"
    return HttpResponse(do_work())
Run Code Online (Sandbox Code Playgroud)

......但这不一定会冲洗.(没有经过测试的代码,但是你明白了;请参阅http://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators.)

大多数基础设施根本不期待零碎的回应.即使Django没有缓冲,你的前端服务器可能也是,而客户端也可能是.这就是为什么大多数事情都使用拉动更新的原因:一个单独的界面来查询长时间运行的请求的状态.

(我希望能够为此类事情进行可靠的推送更新......)