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

4 投票
4 回答
2964 浏览
提问于 2025-04-15 15:42

最近我想通过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 个回答

2

是的,在HttpResponse中返回一个迭代器是完全可以的。这就意味着你可以把内容逐步发送给客户端,而不是一次性发送所有内容。

2

它能正常工作吗?如果不行的话,出现了什么错误?

如果你正在为一个Django网站构建完整的API,可以看看django-piston。它可以帮你处理很多繁琐的工作。

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

11

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

如果你在设置中把 USE_ETAGS = True 打开,CommonMiddleware 会尝试把整个迭代器都消耗掉。不过在现代的 Django(1.1 版本)中,有比 CommonMiddleware + ConditionalGetMiddleware 更好的方法来处理条件获取,那就是使用 condition 装饰器。用这个装饰器,你的流式传输就能正常工作了 :-)

还有一个会尝试消耗迭代器的中间件是 GzipMiddleware。如果你想使用它,可以通过把它变成一个装饰器,应用到单独的视图上,而不是全局使用,这样就能避免对流式响应进行压缩。

撰写回答