当我使用 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>
预期产出
1st:<p>1</p>
第二名:<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>
而不是追加先前的收益率,我希望模板用当前收益率填充。
答案 0 :(得分:10)
你不能这样做。
def home(request):
return StreamingHttpResponse(f1())
StreamingHttpResponse
表示您希望缓慢流式传输数据,而不是一次性传输数据。现在,一旦您将<p>1</p>
放在流媒体上,就无法再将其调回并使其消失
所以你几乎没有选择如何让它发挥作用。
<强> AJAX 强>
您可以从页面进行AJAX调用以更新最新状态,并使用javascript更新相同内容
在这方面你也可以使用现有的设置
jQuery read AJAX stream incrementally?
然后显示最后一行,我不推荐这个
接下来是制作一个只返回当前状态的Ajax方法
<强> Socket.io 强>
您可以将django-socketio用于相同的
Django频道
您可以使用django-channels
但添加sockets
和channels
会成为您问题的附加复杂性。所以你应该试着用纯AJAX解决你的问题
答案 1 :(得分:-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)