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

Tri*_*rix 8 html django streaming httpresponse django-views

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

情况:

我在html上有一个表单,我可以在其中设置一个数字,当它被提交时,调用views.stream_response将值传递给stream.py并返回StreamingHttpResponse并显示"虚拟"空白浏览器页面(/ stream_response /),其中我可以每秒钟看到一个渐进的数字m:

   1
   2
   3
   ..
   m
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

--- 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))
Run Code Online (Sandbox Code Playgroud)

urls.py

...
url(r'^homepage/provadata/$', views.provadata),    
url(r'^stream_response/$', views.stream_response, name='stream_response'),
...
Run Code Online (Sandbox Code Playgroud)

主页/ provadata.html

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

//{{ris}} 
Run Code Online (Sandbox Code Playgroud)

我试图做一个render_to响应留在homepage/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}))
Run Code Online (Sandbox Code Playgroud)

(添加{{ris}}到模板,并
resp = StreamingHttpResponse(stream_response_generator(m))stream_response功能),但我得到的模板:

<generator object streamx at 0x0000000004BEB870>

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

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

sot*_*any 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"
Run Code Online (Sandbox Code Playgroud)