(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