Django中的长轮询

5 投票
1 回答
3560 浏览
提问于 2025-04-16 21:33

我在我的Django应用中使用了一种长轮询的方法,目的是在长时间运行的操作进行时,将状态消息返回给客户端。我通过在视图函数中返回一个HttpResponse对象来实现,这个对象是用一个可以返回字符串的迭代器初始化的。这一切都运行得很好,但这个迭代器的函数变得相当长,里面有很多的yield语句来返回状态消息。

我想更好地设计这个结构,把长时间的操作拆分成多个函数,每个函数返回自己的状态消息。但是我找不到办法来实现这一点。换句话说,我现在有这样的代码:

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()

有没有办法让第二个例子中的yield语句将值返回给迭代器的调用者?如果没有,是否有更好的方法?我看过WebSockets,但感觉它还没有完全成熟(特别是在浏览器支持方面)。我也考虑过真正的服务器轮询,但那样会复杂得多,所以我希望如果可能的话,继续保持开放连接并流式传输消息。

1 个回答

4

试试:

import itertools

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

撰写回答