【问题标题】:Django: Streaming dynamically generated XML output through an HttpResponseDjango:通过 HttpResponse 流式传输动态生成的 XML 输出
【发布时间】:2009-11-05 19:58:30
【问题描述】:

最近我想通过 Django 视图返回一个动态生成的 XML 树。我用于 XML 操作的模块是通常的 cElementTree。

我认为我通过执行以下操作解决了我想要的问题:

def view1(request):
    resp = HttpResponse(g())
    return resp

def g():
     root = Element("ist")
     list_stamp = SubElement(root, "list_timestamp")
     list_creation = str(datetime.now())

     for i in range(1,1000000):
         root.text = str(i)
         yield cET.tostring(root)

这样的事情是个好主意吗?我错过了什么吗?

【问题讨论】:

    标签: python xml django


    【解决方案1】:

    关于中间件“破坏”流式传输:

    CommonMiddleware 将尝试使用您在设置中设置的USE_ETAGS = True 的整个迭代器if。但是在现代 Django (1.1) 中,有一个比 CommonMiddleware + ConditionalGetMiddleware 更好的条件获取方法——condition decorator。使用它,您的流媒体将正常播放:-)

    另一个尝试使用迭代器的东西是 GzipMiddleware。如果您想使用它,您可以通过将其转换为装饰器并应用于单个视图而不是全局视图来避免对流响应进行 gzip 压缩。

    【讨论】:

      【解决方案2】:

      有效吗?如果它不起作用,它会抛出什么错误?

      如果您正在为 django 站点构建完整的 API,请查看 django-piston。它会处理很多与此相关的繁忙工作。

      http://bitbucket.org/jespern/django-piston/wiki/Home

      【讨论】:

      • 它不会抛出任何错误。我认为它工作得很好。我只是想要第二个意见。不幸的是,它不是一个宁静的 api。只是一次序列化数千个对象的视图。
      【解决方案3】:

      是的,在 HttpResponse 中返回迭代器是完全合法的。正如您所发现的,这允许您将内容流式传输到客户端。

      【讨论】:

      • 我担心 django-piston 网站上的一句话提到: * Django 支持使用 ConditionalGetMiddleware 和 CommonMiddleware 进行流中断。我担心任何看不见的影响。
      【解决方案4】:

      是的。这就是你在 Django 上做的方式。

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 2012-03-30
        • 1970-01-01
        • 2018-07-06
        • 2014-07-23
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多