【问题标题】:How to use Tornado work with Django? Is it a good solution?如何在 Django 中使用 Tornado 工作?这是一个很好的解决方案吗?
【发布时间】:2012-10-24 19:59:05
【问题描述】:

我有一个庞大的 django 项目,必须使用 Instagram API 及其订阅模型才能工作。对于订阅,我的服务器必须非常响应并准备好异步工作以设置挂钩,以便在用户发布后接收通知。或者这就是文档的建议。现在在那里使用 Tornado 会是一件好事吗?只是为了那一小部分,还是我可以使用 Django 有效地做到这一点?如果是这样,怎么做?

【问题讨论】:

  • 使用 tornado 编写小部件并使用 ajax 将其集成到 django 应用程序中。
  • 龙卷风不适合这个;看向node.js
  • @BurhanKhalid 为什么你认为Tornadonode.js 之间会有很大的不同?

标签: django tornado instagram


【解决方案1】:

您可以使用 Tornado 之上的 WSGI 容器来托管任何 WSGI 应用程序,包括 Django,但是,当您这样做时,WSGI 应用程序仍然作为阻塞应用程序运行,并且不会神奇地作为异步应用程序运行。因此,当 Django 处理一个请求时,在 Django 中无法同时处理另一个请求。此时的解决方案与运行单线程 WSGI 服务器没有太大区别,您需要拥有多个 Tornado 实例来处理并发请求。

所以这一切都取决于你所说的异步是什么意思。你当然不能在 Django 中使用 Tornado 的直接异步编程 API。因此,通过 WSGI 接口在 Django 中使用 Tornado 并没有真正的好处。

【讨论】:

  • 我想知道为什么这么多人提到这个设置?感谢您提供的信息,因此我不会浪费时间尝试将两者融合。
【解决方案2】:

据我了解,您在Instagram docs 中谈论这一段

您应该构建您的系统以接受每个有效负载的多个更新对象 - 尽管通常只会包含一个。此外,您应该在 2 秒超时内确认 POST - 如果您需要对接收到的信息进行更多处理,您可以在异步任务中执行此操作。

这是 Tornado 提供的另一种“异步”类型。 我认为 Django + Celery 会更适合这个。

您的应用程序将以这种方式工作:

  1. 您从 Instagram 接收 JSON 数据
  2. 创建一个 celery 任务,例如instagram_process.delay(request.raw_post_data)instagram_process.delay(request.body) 取决于你的 Django 版本
  3. 使用 200 状态代码响应 Instagram
  4. instagram_process 任务中,您完成所有流程 - 解析 JSON,将其存储到数据库以及您需要的任何其他内容。

如果您想检查X-Hub-Signature,您可以在第 1 步和第 2 步之间进行检查,或者将此标头传递给任务并在第 4 步验证签名。

【讨论】:

  • 没想到会这样。谢谢您,先生!将尝试以这种方式使其在今天发挥作用。
【解决方案3】:

您可以使用 tornado.wsgi 将 Tornado 与其他 WSGI 兼容框架集成。详情请查看此演示项目:

https://github.com/bdarnell/django-tornado-demo

【讨论】:

  • 这个方案很慢,因为 Django 和 WSGI 是同步的,并且调用诸如 DB 查询会阻塞整个 tornado 服务器。见@graham-dumpleton 回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多