Django:通过HttpResponse流式传输动态生成的XML输出
最近我想通过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。它可以帮你处理很多繁琐的工作。
11
关于中间件“破坏”流式传输:
如果你在设置中把 USE_ETAGS = True
打开,CommonMiddleware 会尝试把整个迭代器都消耗掉。不过在现代的 Django(1.1 版本)中,有比 CommonMiddleware + ConditionalGetMiddleware 更好的方法来处理条件获取,那就是使用 condition
装饰器。用这个装饰器,你的流式传输就能正常工作了 :-)
还有一个会尝试消耗迭代器的中间件是 GzipMiddleware。如果你想使用它,可以通过把它变成一个装饰器,应用到单独的视图上,而不是全局使用,这样就能避免对流式响应进行压缩。