我正在向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中完成这项工作,因为我必须返回响应并且无法控制内容何时进入浏览器.
大多数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没有缓冲,你的前端服务器可能也是,而客户端也可能是.这就是为什么大多数事情都使用拉动更新的原因:一个单独的界面来查询长时间运行的请求的状态.
(我希望能够为此类事情进行可靠的推送更新......)