Отображать текущий статус только в шаблоне в 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)