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

9

由于每个问题最好只有一个单独的问题,如果与我在另一个问题相关,请耐心等待。

情况如下:

我在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)

---UPDATE---

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'),
...

homepage/provadata.html

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

//{{ris}} 

我尝试使用render_to响应保持在首页/provadata.html,并查看渐进式列表,但是stream.py没有启动,我只能在命令行中看到输入数字m

我在views.py中尝试使用这个建议

def stream_response_generator(m):    
    ris = stream.streamx(m) 
    yield loader.get_template('homepage/provadata.html').render(Context({'ris': ris}))

在模板中添加 {{ris}} 并在 stream_response 函数中使用
resp = StreamingHttpResponse(stream_response_generator(m)),但是在模板中我得到了以下结果:

<generator object streamx at 0x0000000004BEB870>

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

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


你看过这个答案吗:https://dev59.com/03A85IYBdhLWcg3wJf8a - ger.s.brett
@ger.s.brett 是的,但它指向(就像在我的情况下)一个“不存在”的HTML页面...我不知道如何更清楚地解释这个问题。 - Trix
如果你想使用Ajax - 你为什么还需要流呢? - ger.s.brett
在许多答案或评论中,我看到人们提到了ajax...所以我尝试使用它,但我认为对于我的目的,StreamHttpResponse是解决方案。我是编程新手,可能有很多我不知道的东西,所以我在这里寻求帮助。 - Trix
stream.py不正确 - 存在语法错误(生成器中不能有带值的返回)。因此,看起来您没有正确发布问题。 - Konstantin Svintsov
显示剩余2条评论
1个回答

3
您可以使用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"

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