Потоковая передача на сайт (например, buildbot) - PullRequest
0 голосов
/ 23 августа 2011

Итак, я пытаюсь работать в потоке stdio для веб-приложения, похожего на Buildbot. Кто-нибудь знает, как Buildbot справляется со stdio? Это потоковое (так кажется), и это было бы именно то, что мне нужно для этой программы.

Кто-нибудь знает, как это сделать?

Любая помощь будет принята с благодарностью.

Кстати, я использую Python с Django

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

Django позволяет вам возвращать итераторы из представлений.Вы можете вернуть итератор, который постепенно читает поток и возвращает его в django. запрос-ответ / # проходящие итераторы ex.фрагмент

Вот простейшее из возможных решений

from django.core.servers.basehttp import FileWrapper
from subprocess import Popen, PIPE
from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_superuser) #SECURE THIS SHIT
def stdout_cmd(request, command):
              #buffsize=1 reads a char at a time
    process = Popen(command, shell=True, buffsize='1', stdout=PIPE)
              # FileWrapper creates an iterator class for stdout
    wrapper = FileWrapper(process.stdout)
              # text/plain causes monospaced output in browser
    return HttpResponse(wrapper, content_type='text/plain')

Пока вы можете создать файлоподобный объект, вы можете обернуть его в FileWrapper.Имейте в виду, что если выходные данные вашей оболочки являются спорадическими, вам нужно будет создать собственный итератор, который будет читать строку за раз, например

wrapper = (line for line in process.stdout) # brackets create an iterator object

ПРИМЕЧАНИЕ. Это потребляет рабочие потоки и блокирует людей, подключающихся к вашему серверу.если у вас слишком много одновременных загрузок страниц с длительным опросом.рассмотрим использование gevent / greenlets.для среды с интенсивным движением.

0 голосов
/ 23 августа 2011

Buildbot использует Twisted , стиль программирования которого отличается от стиля Django.

Я бы сказал, что вам нужно написать сервис в Twisted, чтобы делать то, что вам нужно,Пообщайтесь с ним из Django и сделайте так, чтобы он выполнял нужную вам потоковую часть.

(В Django, как и в большинстве веб-приложений, у вас есть один поток / вызов на запрос, который блокирует вызовы db / io.Twisted, вы откладываете вызовы асинхронных функций в библиотеку и имеете обратные вызовы для продолжения после завершения ввода-вывода. Сначала это выглядит немного странно, но на самом деле это довольно неплохо, особенно для приложений, которые не являются просто веб-серверами.)

...