【发布时间】:2011-10-05 14:46:58
【问题描述】:
我在我的 Django 应用程序中使用一种长轮询来在客户端进行时向客户端返回有关长操作的状态消息。我通过在我的视图函数中返回一个 HttpResponse 对象来做到这一点,该对象使用返回字符串的迭代器进行初始化。这一切都很好,但是迭代器函数变得很长,需要大量的收益来返回状态消息。
我想通过将长操作拆分为多个函数来更好地构建这个,每个函数都返回自己的状态消息。但我看不出有办法做到这一点。换句话说,我有这个:
def my_long_operation():
do_something()
yield "Did something"
do_something_else()
yield "Did something else"
...我想要:
def do_something():
do_first_part_of_something()
yield "Did first part of something"
do_second_part_of_something()
yield "Did second party of something"
def do_something_else():
do_first_part_of_something_else()
yield "Did first part of something else"
do_second_part_of_something_else ()
yield "Did second party of something else"
def my_long_operation():
do_something()
do_something_else()
有没有办法让第二个例子中的收益为迭代器的调用者产生值?如果没有,有没有更好的方法?我查看了 WebSockets,但它似乎还没有完全成熟(尤其是在浏览器支持方面)。我也考虑过对服务器进行真正的轮询,但这会复杂得多,所以我想继续保持打开的连接并尽可能地流式传输消息。
【问题讨论】:
-
请原谅我.. 但是您希望如何使用它并让它发挥作用?
-
简而言之,我使用 HttpResponse(my_long_operation(), mimetype="text/plain") 创建响应对象,并在 HTML 模板中将 readyStateChange 侦听器附加到请求并更新 HTML每当就绪状态发生变化时都会有新数据。
-
FWIW,恕我直言,长轮询实施起来可能很痛苦。在某些情况下它是可取的,但通常情况下,立即返回一个唯一的 Id 并提供一个 url 来轮询状态要简单得多。如果您使用 Db 或单例来保存状态,这非常好。当然,在某些情况下,长轮询是完美的机制,所以不要把它当作福音
标签: python django long-polling