在Tornado Web Server上运行Django以获得async + django admin + django orm的最佳方法是什么?

时间:2012-01-04 20:45:55

标签: django orm tornado django-wsgi

我想拥有龙卷风后端的django管理面板,它将处理来自在线游戏的请求。我现在不知道,以下一种方式加载django app是个好主意:

wsgi_app = tornado.wsgi.WSGIContainer(
django.core.handlers.wsgi.WSGIHandler())
tornado_app = tornado.web.Application(
[
  ('/hello-tornado', HelloHandler),
  ('.*', tornado.web.FallbackHandler, dict(fallback=wsgi_app)),
])
server = tornado.httpserver.HTTPServer(tornado_app)
server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

HelloHandler将成为后端解析器。

在组合wsgi + ioloop时我会失去一些表现吗?

如果它是一个糟糕的解决方案,它可以运行2个应用程序:django admin和tornado web。你能否回答我如何在Tornado App中使用Django ORM?

2 个答案:

答案 0 :(得分:15)

只需采用这个等式并解决它。

  • 您希望拥有非阻止IO - X.
  • 你想拥有django ORM - Y。
  • 你想拥有django admin - Z。

现在,逐点移动:

  • 对于X--龙卷风本身就足够了。
  • 对于Z - django本身就足够了。我不认为,你想拥有 成千上万的管理员,一次管理您的网站。
  • 对于Y来说更难。 Django ORM正在阻止自己。

这里最好的方式 - 不要将Django ORM与龙卷风一起使用。

第二种方式 - 如果您确定它不会阻止整个应用程序,您可以深入深入并将其直接集成到龙卷风中。从this回答中解决问题。

第三种方式 - 您可以将django应用程序转换为服务,这会使ORM工作繁重,您可以使用龙卷风中的AsyncHTTPCLient访问此服务。

第四种方式 - 将龙卷风Web服务器集成到您的django应用程序中。实际上,它会给你带来很小的性能提升。

第五种方式 - 使用两个龙卷风Web服务器。听起来很疯狂,是的。使用一个与Django ORM集成,第二个与AsyncHTTPClient

我相信,你可以充分利用2个世界。

答案 1 :(得分:5)

Django不是异步的,因此在Tornado中运行Django将消除您从Tornado获得的大部分性能优势。

如果你想要最大的异步性能,你应该将Tornado与非阻塞数据库一起使用(我假设你想让Django管理员使用SQL数据库)。

如果您想要最大程度的开发,请使用Django及其ORM系统和管理工具。

不幸的是,你不能只混合两全其美。

所以,是的,你会失去表现。在这种情况下,我可能会使用Tornado并放弃Django管理员。如果您已经做好了妥协,那么您可以编写两个应用程序,共享一个数据库,但这意味着您需要维护两个数据访问层。