Использование генератора для потоковой передачи данных JSON в реальном времени из подпроцесса в Django с помощью JQuery - PullRequest
1 голос
/ 25 сентября 2010

Я хочу в реальном времени прочитать вывод подпроцесса, вызванного из формы в представлении.Вот мои views.py:

@login_required
@condition(etag_func=None)
def sync_form(request):
    # do things to validate form
    return HttpResponse(sync_job(request, job_id, src, dest))

def sync_job(request, job_id, src, dest):
    # we check the arguments here
    sync_process = Popen([str(command), str(arguments), str(src), str(dest)], stdout=PIPE)
    for line in sync_process.stdout:
      yield simplejson.dumps(line.rstrip())
    syncoutput,syncerror = sync_process.communicate()
    check.log = syncoutput
    check.save()

Я прочитал здесь , что функция etag может предотвращать потоковую передачу, поэтому ее лучше отключить.Вот что мне нужно для получения данных json:

 $.ajax({
        url: '{% url monitor %}',
    dataType: 'json',
    type: 'get',
        success: function(data) {
            $('#sync_response').html(data);
        }
    });

monitor - это URL-адрес приложения, в котором есть форма для отправки запроса.Когда я запрашиваю подпроцесс, он остается в том же URL-адресе (http://localhost:8000/monitor) и просто выдает мне текстовый вывод, подобный следующему:

"sending incremental file list""""sent 116 bytes received 12 bytes 256.00 bytes/sec"

Можно ли передавать данные с использованием этого подхода?Если так, что я делаю не так? Спасибо.

1 Ответ

2 голосов
/ 25 октября 2010

Проблема с этим подходом состоит в том, что, вообще говоря, JavaScript не будет работать до тех пор, пока ответ не будет полностью выполнен, даже если ответ становится потоковым.Вы можете перепрыгнуть через множество обручей, чтобы сделать эту работу, но вам лучше пойти с чужим решением, потому что есть много возможностей заставить его работать во всех браузерах и через HTTP прокси и тому подобное.(Если вы уверены, я бы посмотрел на этот вопрос SO для конфигурации сервера: Потоковый ответ HTTP, сброс в браузер )

Мне очень повезло, что я отправил данные вJavaScript с коробкойhttp://hookbox.org/ Это python-сервер, который легко интегрируется с django и позволяет передавать данные в клиент javascript.Это следует за механизмом «публикации / подписки», так что одна сторона (может быть python на сервере или javascript на клиенте) может публиковать данные, которые может получить любая другая сторона.Сообщения доставляются практически мгновенно.Hookbox будет использовать либо длинные опросы GET (комета), либо html5 веб-сокеты, если они доступны.

Как я уже сказал, сделать это правильно сложно - лучше всего перейти на более высокий уровень абстракции и позволить чьей-то библиотеке позаботиться о механике доставки.

- ОБНОВЛЕНИЕ сентябрь 2012-

Крючок мертв.Его автор отказался от этого, даже не отвечая на электронные письма людей, пытающихся поддержать это.Попробуйте www.pusher.com.

...