(Es fühlt sich an, als ob output_buffering in PHP deaktiviert ist.)
Verwenden Sie StreamingHttpResponse.
Da das erste Argument von StreamingHttpResponse ein Generator ist, schreiben Sie den Stapel mit dem Generator.
In diesem Beispiel wird der Shell-Befehl als Generator verwendet.
import subprocess
from django.http import StreamingHttpResponse
from django.utils.encoding import smart_str
from django.utils.html import escape
from django.views import View
def run_process_as_generator(*args, **kwargs):
"""
Rückgabe des Subprozessergebnisses im Generator
:rtype: generator
"""
kwargs.setdefault('stdout', subprocess.PIPE)
kwargs.setdefault('stderr', subprocess.STDOUT)
popen = subprocess.Popen(*args, **kwargs)
while True:
line = popen.stdout.readline()
if line:
yield line
if not line and popen.poll() is not None:
break
def linebreaksbr(gen):
"""
In jeder Zeile des Generators<br />Anziehen
Smart nur für den Fall_str
:type gen: generator
:rtype: generator
"""
for line in gen:
yield '{}<br />\n'.format(escape(smart_str(line)))
def task():
"""
Batch ausführen
:rtype: generator
"""
return linebreaksbr(
run_process_as_generator(
"for i in {1..10}; do sleep 1s; echo ${i}; done",
shell=True
))
class SlowCommandView(View):
"""
task()Eine Ansicht, die das Ergebnis von zurückgibt
"""
def get(self, request, *args, **kwargs):
response = StreamingHttpResponse(
task(),
content_type="text/html; charset=utf-8")
return response
Wenn Sie einen Stapel in Python schreiben, ist es eine gute Idee, Yield zu verwenden, anstatt ein Log-In-Print zu drucken.
def task():
yield 'start'
...
yield 'phase-1'
...
for xx in xxx:
yield xx
yield 'end'
Referenz: Standardausgabe in Echtzeit mit Python-Subprozess-Qiita abrufen
Request and response objects | Django documentation | Django
Recommended Posts