Django StreamingHttpResponse 到模板中

Ess*_*eTi 2 django templates stream

Django 1.5 刚刚发布并提供了 StreamingHttpResponse。现在,我已经阅读了这个讨论 ,第二个答案实际上在页面中打印出流(实际上只是数据)。

我想要做的是将流响应的输出打印到模板中,而不仅仅是像讨论中那样打印数据。

我该怎么办?我是否必须使用 javascript 并调用实现 StreamingHttpResponse 的视图,或者有一种方法可以告诉 django 呈现模板,然后将 StreamingHttpResponse 数据发送到模板(然后我需要知道存储数据的变量是什么) ?

编辑:到目前为止我发现的解决方案是将最终 html 页面的部分写入生成器(产量)。这个解决方案的问题是,例如,我不能有一个随着数据流而增长的条(如加载条)。

再见

Fra*_*ank 7

是的,但它可能不是您真正想要的,因为将迭代整个模板。但是,就其价值而言,您可以为模板流式传输重新渲染的上下文。

from django.http import StreamingHttpResponse
from django.template import Context, Template

#    Template code parsed once upon creation, so
#        create in module scope for better performance

t = Template('{{ mydata }} <br />\n')

def gen_rendered():
    for x in range(1,11):
        c = Context({'mydata': x})
        yield t.render(c)

def stream_view(request):
    response = StreamingHttpResponse(gen_rendered())
    return response
Run Code Online (Sandbox Code Playgroud)

编辑:您也可以渲染模板并在其上附加<p><tr>标记,但这首先与模板的目的背道而驰。(即从代码分离演示)

from django.template import loader, Context
from django.http import StreamingHttpResponse

t = loader.get_template('admin/base_site.html') # or whatever
buffer = ' ' * 1024

def gen_rendered():  
    yield t.render(Context({'varname': 'some value', 'buffer': buffer}))
    #                                                 ^^^^^^
    #    embed that {{ buffer }} somewhere in your template 
    #        (unless it's already long enough) to force display

    for x in range(1,11):
        yield '<p>x = {}</p>{}\n'.format(x, buffer)
Run Code Online (Sandbox Code Playgroud)