Каков наилучший способ запустить 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. Если вы настроены на компромисс, вы можете написать два приложения, разделяя базу данных, но это будет означать, что вам нужно поддерживать два уровня доступа к данным.