【发布时间】:2011-09-12 16:06:37
【问题描述】:
我们有一个 Django 应用程序,它需要通过 XML API 从 Web 服务器发布消息并将文件上传到另一台服务器。我们需要进行 X 次异步文件上传,然后在上传完成后发出另一个 XML API 请求。我还希望文件从磁盘流式传输,而不必先将它们完全加载到内存中。最后,我需要将文件作为 POST 正文中的 application/octet-stream 发送(而不是更典型的表单数据 MIME 类型),但我无法找到使用 urllib2 或 httplib 执行此操作的方法。
我最终将 Twisted 集成到应用程序中。它似乎非常适合这项任务,果然我能够编写一个漂亮干净的实现,每次上传都有延迟。我使用自己的 IBaseProducer 以块的形式从文件中读取数据,并将其以 POST 请求正文的形式发送到服务器。不幸的是,后来我发现 Twister reactor 无法重新启动,所以我不能只运行它然后在我想上传文件时停止它。由于 Twisted 显然更多地用于成熟的服务器,我现在想知道这是否是正确的选择。
我不确定我是否应该: a) 配置 WSGI 容器(目前我正在使用 manage.py 进行测试)以在启动时启动 Twisted 线程并使用 blockingCallFromThread 来触发我的文件上传。 b) 使用 Twisted 作为 Django 应用程序的 WSGI 容器。我假设我们稍后会在 Apache 上进行部署,但我不确定如果我们采用这条路线会产生什么影响。 c) 只需 Twisted 并使用其他方法进行文件上传。有点遗憾,因为带有延迟的 Twisted 方法既优雅又有效。
我们应该选择哪一个,还是有其他选择?
【问题讨论】: