仅在Django中的StreamingHttpResponse中的模板上呈现当前状态

时间:2018-03-20 18:27:54

标签: python django python-3.x python-2.7 python-requests

当我使用 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>

而不是追加先前的收益率,我希望模板用当前收益率填充。

2 个答案:

答案 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

但添加socketschannels会成为您问题的附加复杂性。所以你应该试着用纯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)