使用Twisted从Django app上传异步文件

时间:2011-09-12 16:06:37

标签: django twisted

我们有一个Django应用程序需要通过XML API发布消息并将文件从Web服务器上传到另一台服务器。我们需要进行X异步文件上传,然后在完成上传后再发出一个XML API请求。我也喜欢从磁盘流式传输文件,而不必先将它们完全加载到内存中。最后,我需要将文件作为application / octet-stream发送到POST主体(而不是更典型的表单数据MIME类型),并且我无法找到使用urllib2或httplib执行此操作的方法。

我最终将Twisted集成到应用程序中。它对于这项任务来说似乎很完美,而且我确实能够为每次上传编写一个非常干净的实现延迟。我使用自己的IBaseProducer以块的形式从文件中读取数据,并将其发送到POST请求体中的服务器。不幸的是,我发现Twister反应器无法重新启动,所以我不能只运行它然后在我想上传文件时停止它。由于Twisted显然更多地用于完整的服务器,我现在想知道这是否是正确的选择。

我不确定我是否应该: a)配置WSGI容器(目前我正在使用manage.py进行测试)在启动时启动Twisted线程并使用blockingCallFromThread来触发我的文件上传。 b)使用Twisted作为Django应用程序的WSGI容器。我假设我们稍后要在Apache上进行部署,如果采用这种方法,我不确定其含义是什么。 c)只需扭曲并使用其他方法进行文件上传。有点羞耻,因为扭曲的延迟方法很优雅而且很有效。

我们应该选择哪一个,还是有其他选择?

1 个答案:

答案 0 :(得分:1)

为什么要稍后在Apache上部署?扭曲是rad。我会做(b)直到有人提出具体的,令人信服的理由不这样做。然后我会做(a)。幸运的是,您的应用程序代码看起来都是一样的。 blockingCallFromThread无论Twisted是否是您的WSGI容器都可以正常工作 - 无论哪种方式,您只需处理在运行反应器的单独线程中运行代码。