【问题标题】:Render current status only on template in StreamingHttpResponse in Django仅在 Django 的 StreamingHttpResponse 中的模板上呈现当前状态
【发布时间】:2018-08-29 17:00: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>

预期输出

第一个:&lt;p&gt;1&lt;/p&gt;

第二个:&lt;p&gt;2&lt;/p&gt; 而不是 &lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;

第三个:&lt;p&gt;3&lt;/p&gt; 而不是 &lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;

第四个:&lt;p&gt;4&lt;/p&gt; 而不是 &lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;3&lt;p&gt;&lt;/p&gt;4&lt;p&gt;&lt;/p&gt;

我希望模板填充当前产量,而不是附加上一个产量。

【问题讨论】:

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


    【解决方案1】:

    你不能这样做。

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

    StreamingHttpResponse 表示您希望缓慢传输数据,而不是一次性传输。现在,一旦您将 &lt;p&gt;1&lt;/p&gt; 放在流上,您就不能只是回调它并使其消失

    所以在如何让它工作方面你几乎没有选择。

    AJAX

    您可以从页面进行 AJAX 调用,更新最新状态并使用 javascript 进行更新

    在此您也可以将现有设置与

    一起使用

    jQuery read AJAX stream incrementally?

    然后显示最后一行,不过我不推荐这个

    接下来是做一个只返回当前状态的Ajax方法

    Socket.io

    你也可以使用django-socketio

    Django 频道

    你可以使用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)
      

      【讨论】:

      • 呃,那是什么?多次退货?
      猜你喜欢
      • 2013-02-13
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      相关资源
      最近更新 更多