Длительный опрос в Джанго - PullRequest
5 голосов
/ 14 июля 2011

Я использую своего рода длинный опрос в своем приложении 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, но, похоже, он еще не полностью выпечен (особенно с точки зрения поддержки браузера). Я также рассмотрел реальный опрос сервера, но это будет намного сложнее, поэтому я хотел бы продолжать поддерживать открытое соединение и передавать сообщения, если это возможно.

1 Ответ

4 голосов
/ 14 июля 2011

Попробуйте:

import itertools

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