Django:在现有的 html 页面上返回 StreamingHttpResponse

Posted

技术标签:

【中文标题】Django:在现有的 html 页面上返回 StreamingHttpResponse【英文标题】:Django: return a StreamingHttpResponse on an existing html page 【发布时间】:2015-07-09 23:26:33 【问题描述】:

由于每个问题最好有一个问题,如果与同一项目相关的another my question 的另一部分相似,请耐心等待。

情况:

我在 html 上有一个表单,我可以在其中设置一个数字,提交时调用views.stream_response 将值传递给 stream.py 并返回一个 StreamingHttpResponse 和“虚拟”空白浏览器页面出现 (/stream_response/),我可以在其中看到每秒递增的数字,最高可达 m

   1
   2
   3
   ..
   m

stream.py

import time

def streamx(m):
    lista = []
    x=0
    while len(lista) < m:      
        x = x + 1
        time.sleep(1)
        lista.append(x)
        yield "<div>%s</div>\n" % x 
        print(lista[-1])    
    return (x)

---更新---

views.py

def stream_response(request):   
    test = InputNumeroForm()   
    if request.method == 'POST':
        test = InputNumeroForm(data=request.POST)
        if test.is_valid():
            m = test.cleaned_data['numero']     
            print (test)      
            print("m = ", m) 
            #resp = StreamingHttpResponse(stream_response_generator(m))
            resp = StreamingHttpResponse(stream.streamx(m))
            return resp               
        return render(request, 'homepage/provadata.html','user.username': request, 'test': test, context_instance = RequestContext(request))

urls.py

...
url(r'^homepage/provadata/$', views.provadata),    
url(r'^stream_response/$', views.stream_response, name='stream_response'),
...

主页/provadata.html

<form  id="numero" action="/stream_response_bis/" method="POST">
    % csrf_token %
    test                                
    <input type="submit" value="to view" />
</form> 

//ris 

我尝试做一个 render_to 响应以留在 homepage/provadata.html 上并查看渐进式列表,但 stream.py 没有启动,我只能看到在命令行输入数字m

我在 views.py

中尝试了 THIS 建议
def stream_response_generator(m):    
    ris = stream.streamx(m) 
    yield loader.get_template('homepage/provadata.html').render(Context('ris': ris))

(在 stream_response 函数中添加ris 到模板和resp = StreamingHttpResponse(stream_response_generator(m))) 但我在模板上获得:

&lt;generator object streamx at 0x0000000004BEB870&gt;

并在命令行上打印输入值,但不再将参数传递给 stream.py。

那么.. 我该如何解决这个问题?

【问题讨论】:

你看过这个答案了吗:***.com/questions/2922874/… @ger.s.brett 是的,但它指向(就像在我的情况下)一个“不实际存在”的 html 页面......我不知道如何以更清晰的方式解释这一点。 如果你想使用 ajax - 为什么你需要流? 在许多答案或 cmets 中,我看到人们指的是 ajax ......所以我尝试了它,但我认为对于我的目的来说 StreamHttpResponse 是解决方案。我是编程新手,可能有很多我不知道的东西,所以我在这里寻求帮助。 你的问题解决了吗?你需要一个正确的答案吗? 【参考方案1】:

您可以使用 StreamingHttpResponse 来指示您希望将结果流式传输回来,并且 django 附带的所有中间件都知道这一点,并相应地采取行动,不缓冲您的内容输出,而是直接发送。

您可以使用条件装饰器禁用 ETAG 中间件。这将使您的响应通过 HTTP 流回。您可以使用 curl 等命令行工具来确认这一点。但这可能不足以让您的浏览器在响应流式传输时显示响应。为了鼓励浏览器在响应流式传输时显示响应,您可以将一堆空白推入管道以强制其缓冲区填充。示例如下:

from django.views.decorators.http import condition

@condition(etag_func=None)
def stream_response(request):
    resp = HttpResponse( stream_response_generator(), mimetype='text/html')
    return resp

def stream_response_generator():
    yield "<html><body>\n"
    for x in range(1,11):
        yield "<div>%s</div>\n" % x
        yield " " * 1024  # Encourage browser to render incrementally
        time.sleep(1)
    yield "</body></html>\n"

【讨论】:

以上是关于Django:在现有的 html 页面上返回 StreamingHttpResponse的主要内容,如果未能解决你的问题,请参考以下文章

在现有的同级 html 元素下移动和定位元素

Django CMS - 无法修改新添加网页的结构

Unity 3D:在现有的Android游戏场景中显示AdMob的横幅

在现有的 JPanel 上绘制 JLayeredPane

如何在 django 的同一页面上返回结果?

如何在现有的 Apache Spark 独立集群上安装 Apache Zeppelin