Отображать текущий статус только в шаблоне в StreamingHttpResponse в Django

Я пытался отобразить статус обработки для пользователя на передней панели, когда я использовал StreamingHttpResponse.

Мне удалось получить текущий статус, но он добавлен к предыдущему.
Я хочу, чтобы шаблон ответа содержал только текущий доход.

views.py

from django.shortcuts import render
from django.http import StreamingHttpResponse,HttpResponse
import time

def f1():
    x = 0
    while x<5:
        time.sleep(1)
        x = x+1
        code = """<p>{}</p>""".format(x)
        yield code


def home(request):
    return StreamingHttpResponse(f1())

вывода в браузере

 <p>1</p>
 <p>2</p>
 <p>3</p>
 <p>4</p>

ожидаемый результат

1-й: <p>1</p>

2: <p>2</p> вместо <p>1</p><p>2</p>

3: <p>3</p> вместо <p>1</p><p>2</p><p>3</p>

4: <p>4</p> вместо <p>1</p><p>2</p>3<p></p>4<p></p>

вместо добавления предыдущего урожая я хочу, чтобы шаблон был заполнен текущим урожаем.

Ответ 1

Вы не можете этого сделать.

def home(request):
    return StreamingHttpResponse(f1())

StreamingHttpResponse означает, что вы хотите передавать данные медленно, а не один раз. Теперь, когда вы разместили <p>1</p> в потоке, вы не можете просто вызвать его обратно и заставить его исчезнуть

Таким образом, у вас мало вариантов того, как заставить его работать.

AJAX

Вы можете со страницы сделать вызов AJAX, который обновляет последний статус, и вы обновляете его с помощью javascript

В этом вы также можете использовать существующую

jQuery читать поток AJAX постепенно?

И затем отобразите последнюю строку, я не буду рекомендовать это, хотя

Далее следует сделать метод Ajax, который возвращает только текущий статус

Socket.io

Вы можете использовать django-socketio для того же

Каналы Django

Вы можете использовать django-каналы

Но добавление sockets и channels будет сложной сложностью для вашей проблемы. Поэтому вы должны попытаться решить проблему с помощью чистого AJAX

Ответ 2

def f1():
    x = 1
    while x < 5:
        time.sleep(1)
        x += 1
        s = str()
        for i in range(1,x):
            s+= """<p>{}</p>""".format(str(i))
        code = s
        yield code

Я так думаю...

def home(request):
     for z in f1():
         return StreamingHttpResponse(z)