Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best way to run Django on Tornado Web Server to have async + django admin + django orm possibilities?

I would like to have django admin panel with tornado backends, which will process requests from online game. I dont know at the moment, is it a good idea to load django app in the next way:

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 is going to be a backend parser.

Will I loose some performance in combining wsgi + ioloop ?

If its a bad solution, its possible to run 2 apps: django admin and tornado web. Could you answer how can I use Django ORM with Tornado App?

like image 215
Romans Ruskovs Avatar asked Jan 04 '12 20:01

Romans Ruskovs


2 Answers

Just take this equation and solve it.

  • You want to have non-blocking IO - X.
  • You want to have django ORM - Y.
  • You want to have django admin - Z.

Now, move point by point:

  • For X - tornado is enough itself.
  • For Z - django is enough itself. I don't think, you want to have thousands of administrators, that manage your site at one time.
  • For Y it is harder. Django ORM is blocking itself.

Best way here - not to use Django ORM with tornado.

Second way - you can dive deeper and integrate it directly in tornado, if you are sure that it will not block whole application. Take solution from this answer.

Third way - you can convert your django application to service, that makes heavy work with ORM, and you can access this service with AsyncHTTPCLient from tornado.

Fourth way - integrate tornado web server into your django application. Actually, it will give you small performance boost.

Fifth way - use two tornado web servers. Sounds crazy, yes. Use one with Django ORM integrated, and second with AsyncHTTPClient.

I believe, that you can take best of 2 worlds.

like image 124
Nikolay Fominyh Avatar answered Oct 20 '22 11:10

Nikolay Fominyh


Django is not asynchronous, so running Django in Tornado will remove most of the performance benefits you might get from Tornado.

If you want maximum async performance, you should use Tornado with a non-blocking database (I'm assuming you want Django admin for use with a SQL database).

If you want maximum ease of development, use Django, with it's ORM system and admin tools.

You can't just mix the best of both worlds, unfortunately.

So, yes, you will lose performance. In this situation I would probably use Tornado and give up on Django admin. If you're dead set on a compromise you could write two apps, sharing a database, but that will mean you need to maintain two data access layers.

like image 42
Cole Maclean Avatar answered Oct 20 '22 12:10

Cole Maclean