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

12

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

我希望模板被填充当前的yield,而不是附加以前的yield。

2个回答

10

你不能以这种方式进行。

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

StreamingHttpResponse 意味着您想要缓慢地流式传输数据,而不是一次性传输。现在,一旦您在流中放置了 <p>1</p> ,您就无法将其调回并使其消失。

所以您有几个选项来让它工作。

AJAX

您可以从页面发起 AJAX 调用,更新最新状态并使用 Javascript 更新相同的内容。

在此过程中,您可以使用现有设置和jQuery 逐步读取 AJAX 流,然后显示最后一行,但我不建议这样做。

接下来是制作仅返回当前状态的 AJAX 方法。

Socket.io

您可以使用 django-socketio 达到相同的效果。

Django Channels

您可以使用 django-channels

但添加 socketschannels 将增加问题的复杂度。因此,您应该尝试只使用纯 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)

啊,那是什么?多个返回值? - Antoine Pinsard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接