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

时间:2015-04-30 10:02:00

标签: html django django-views streaming httpresponse

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

情况:

我在html上有一个表单,我可以在其中设置一个数字,当它被提交时,调用views.stream_response将值传递给 stream.py 并返回一个< em> 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'),
...

主页/ 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

中尝试了THIS建议
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。

所以.. 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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