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

Я хотел бы иметь панель администратора 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 с Торнадо Приложение?

2 ответов


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

  • вы хотите иметь неблокирующий IO-X.
  • вы хотите иметь django ORM-Y.
  • вы хотите иметь Django admin-Z.

теперь пошли по пунктам:

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

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

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

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

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

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

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


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

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

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

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

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