Как лучше всего запустить Django на веб-сервере Tornado, чтобы иметь возможности async + django admin + django orm? - PullRequest
8 голосов
/ 05 января 2012

Я хотел бы иметь админ-панель django с бэкэндами торнадо, которая будет обрабатывать запросы от онлайн-игры.В настоящий момент я не знаю, будет ли хорошей идеей загрузить приложение django следующим образом:

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.Не могли бы вы ответить, как использовать Django ORM с приложением Tornado?

Ответы [ 2 ]

15 голосов
/ 30 июля 2012

Просто возьмите это уравнение и решите его.

  • Вы хотите иметь неблокирующий ввод / вывод - X.
  • Вы хотите иметь django ORM - Y.
  • Вы хотите иметь администратора django - Z.

Теперь, перемещайтесь точка за точкой:

  • Для Х - самого торнадо достаточно.
  • Для Z - Джанго достаточно самого себя. Я не думаю, вы хотите иметь тысячи администраторов, которые управляют вашим сайтом одновременно.
  • Для Y это сложнее. Django ORM блокирует себя.

Лучший способ - не использовать Django ORM с торнадо.

Второй способ - вы можете погрузиться глубже и интегрировать его непосредственно в торнадо, если вы уверены, что он не заблокирует все приложение. Возьмите решение из этого ответа.

Третий способ - вы можете преобразовать ваше приложение django в службу, которая интенсивно работает с ORM, и вы можете получить доступ к этой службе с помощью AsyncHTTPCLient из торнадо.

Четвертый способ - интегрировать веб-сервер торнадо в ваше приложение django. На самом деле, это даст вам небольшой прирост производительности.

Пятый способ - использовать два веб-сервера торнадо. Звучит безумно, да. Используйте один с интегрированным Django ORM, а второй с AsyncHTTPClient.

Я считаю, что вы можете взять лучшее из 2 миров.

5 голосов
/ 06 января 2012

Django не является асинхронным, поэтому запуск Django в Tornado удалит большинство преимуществ производительности, которые вы можете получить от Tornado.

Если вам нужна максимальная асинхронная производительность, вы должны использовать Tornado с неблокирующей базой данных (я предполагаю, что вы хотите, чтобы администратор Django использовал с базой данных SQL).

Если вам нужна максимальная простота разработки, используйте Django с его системой ORM и инструментами администратора.

К сожалению, вы не можете просто смешать лучшее из обоих миров.

Итак, да, вы потеряете производительность. В этой ситуации я бы, вероятно, использовал Tornado и отказался от админки Django. Если вы не готовы к компромиссу, вы можете написать два приложения, совместно использующих базу данных, но это будет означать, что вам нужно поддерживать два уровня доступа к данным.

...