Django StreamingHttpResponse如何应用于模板中

3
Django 1.5刚刚发布,其中包含StreamingHttpResponse。我已经阅读了this discussion,第二个答案实际上在页面中打印出流(实际上只是数据)。
我想做的是将流响应的输出打印到模板中,而不仅仅是像the discussion中那样打印数据。
我该怎么办?我需要使用JavaScript并调用实现StreamingHttpResponse的视图,还是有一种方法告诉django呈现模板,然后将StreamingHttpResponse数据发送到模板(然后我需要知道存储数据的变量是什么)?
编辑:到目前为止,我找到的解决方案是将最终html页面的部分写入生成器(yield)。这种解决方案的问题是,例如,我无法拥有随着数据流式传输而增长的栏(例如加载栏)。
再见
1个回答

9

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

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

编辑: 你也可以渲染一个模板,然后只需在其后添加<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)

好的,我已经到了这个点。根据这个答案和这个 Django Google Groups 主题[https://groups.google.com/d/msg/django-users/eQ2SVB_uYuE/IayaI0YlPngJ] 以及回复,据我所理解,我想要做的事情不应该用这种方式来完成。 感谢您的帮助。 - EsseTi
1
我对_shouldn't_不确定。如果你有一个小项目,你可以控制演示和逻辑,我认为这是可以接受的。我回答它是因为我正在实施它。请注意,即使关闭浏览器页面,逻辑(我的是批量添加)仍然会继续运行。 - Frank

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