【问题标题】:Using Twisted for asynchronous file uploads from Django app使用 Twisted 从 Django 应用程序进行异步文件上传
【发布时间】: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 方法既优雅又有效。

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

【问题讨论】:

    标签: django twisted


    【解决方案1】:

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

    【讨论】:

    • 如果还有其他需要 Apache 的原因,反向代理是一种选择。要么将 Apache 作为前端运行,要么使用 Twisted 的 ReverseProxyResource 对象反向代理正在使用的 Apache 组件。这样你就可以在 Twisted 的 WSGI 容器中部署 Django,但仍然使用 Apache 来实现 不使用 使用 mod_wsgi
    猜你喜欢
    • 2015-07-12
    • 2010-10-30
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2011-06-04
    • 2010-10-14
    相关资源
    最近更新 更多