Django:通过HttpResponse流式传输动态生成的XML输出

4
最近,我想通过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)

这是一个好主意吗?我有遗漏什么吗?
4个回答

11

关于中间件“破坏”流的问题:

如果在设置中将USE_ETAGS = True,CommonMiddleware 将尝试消耗整个迭代器。但在现代 Django(1.1)中,有一种更好的方法可以执行条件获取,而不是使用 CommonMiddleware + ConditionalGetMiddleware -- 使用condition装饰器。使用它,您的流式传输将正常运行 :-)

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


2

它没有抛出任何错误。我认为它运行得很好。我只是想要第二个意见。不幸的是,它不是一个RESTful API,只是一次性序列化成千上万个对象的视图。 - Leonidas Tsampros

2

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


我担心 django-piston 网站中提到的一条评论:
  • Django 对流式处理的支持与 ConditionalGetMiddleware 和 CommonMiddleware 不兼容。
我担心是否会有任何未知的后果。
- Leonidas Tsampros

2
是的,这就是在 Django 上的操作方式。

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