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.для среды с интенсивным движением.