[PYTHON] In Django werden Batch- (Befehls-) Ergebnisse nacheinander in HTML angezeigt

(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

In Django werden Batch- (Befehls-) Ergebnisse nacheinander in HTML angezeigt
HTML in Jupyter-Notizbuch anzeigen
Django ~ Lass es uns im Browser anzeigen ~
Empfangen und Anzeigen von HTML-Formulardaten in Python
Fehlermeldung anzeigen, wenn die Anmeldung in Django fehlschlägt
Django HTML Vorlage Teil 2
Modell in Django
Django HTML-Vorlage
Django + Docker-Befehl
Form in Django