Python Django的长时间投票

Python Django的长时间投票,python,django,long-polling,Python,Django,Long Polling,我在Django应用程序中使用了一种长轮询,以便在客户端执行长操作时向客户端返回状态消息。为此,我在视图函数中返回一个HttpResponse对象,该对象由返回字符串的迭代器初始化。这一切都很好,但是迭代器函数变得相当长,返回状态消息的收益率非常高 我希望通过将长操作拆分为多个函数来更好地构建它,每个函数都返回自己的状态消息。但我看不出有什么办法。换句话说,我有: def my_long_operation(): do_something() yield "Did something"

我在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()
在第二个示例中,是否有某种方法可以获得收益率,从而向迭代器的调用者提供值?如果没有,是否有更好的方法?我看过WebSocket,但它似乎还没有完全成熟(特别是在浏览器支持方面)。我还考虑了对服务器进行真正的轮询,但这将更加复杂,因此如果可能的话,我希望继续保持开放的连接,并通过流式传输消息。

尝试:

import itertools

def my_long_operation():
    return itertools.chain(do_something(), do_something_else())

请原谅。。但是您希望如何使用它以及如何使其工作呢?简而言之,我使用HttpResponse(my_long_operation(),mimetype=“text/plain”)创建响应对象,并在HTML模板中向请求附加readyStateChange侦听器,并在就绪状态更改时使用新数据更新HTML。FWIW,很长时间的轮询很难实现。在某些情况下,这是可取的,但通常情况下,立即返回唯一Id并提供url以轮询状态要简单得多。如果您使用Db或singleton来保存状态,这非常好。当然,在有些情况下,长时间投票是一种完美的机制,所以不要把它当作福音