Как использовать Tornado для работы с Django? Это хорошее решение?

У меня огромный проект django, и для работы мне нужно использовать Instagram API и его модель подписки. Для подписок мой сервер должен быть очень отзывчивым и быть готовым к асинхронной работе, чтобы настроить ловушку, чтобы получать уведомления после публикации пользователем. Или это то, что предлагает документация. Будет ли хорошо использовать там Tornado? Только для этой небольшой части или я могу сделать это с помощью Django эффективным способом? если да, то как?


person Hick    schedule 22.10.2012    source источник
comment
Напишите виджет с помощью tornado и интегрируйте его в приложение django с помощью ajax.   -  person Nikolay Fominyh    schedule 22.10.2012
comment
Торнадо не подходит для этого; смотреть в сторону node.js.   -  person Burhan Khalid    schedule 24.10.2012
comment
@BurhanKhalid Как вы думаете, почему между Tornado и node.js будет большая разница?   -  person Igor    schedule 24.10.2012


Ответы (3)


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

Так что все действительно зависит от того, что вы подразумеваете под асинхронностью. Вы, конечно, не можете использовать API прямого асинхронного программирования Tornado в Django. Таким образом, нет большой выгоды от использования Tornado с Django через интерфейс WSGI.

person Graham Dumpleton    schedule 24.10.2012
comment
Интересно, почему так много людей упомянули эту настройку? Спасибо за информацию, так что я не трачу свое время, пытаясь сойтись два. - person Chris Hawkes; 08.02.2014

Насколько я понимаю, вы говорите об этом абзаце в документах Instagram.

Вы должны построить свою систему так, чтобы она принимала несколько объектов обновления для каждой полезной нагрузки, хотя часто будет включен только один. Кроме того, вы должны подтвердить POST в течение 2-секундного тайм-аута — если вам нужно выполнить дополнительную обработку полученной информации, вы можете сделать это в асинхронной задаче.

Это еще один тип «асинхронности», который предоставляет Tornado. Я думаю, что Django + Celery подойдет для этого лучше.

Ваше приложение будет работать следующим образом:

  1. Вы получаете JSON-данные от Instagram
  2. Создайте задачу сельдерея, например. instagram_process.delay(request.raw_post_data) или instagram_process.delay(request.body) в зависимости от вашей версии Django
  3. Ответ в Instagram с кодом статуса 200
  4. В задаче instagram_process вы выполняете всю свою обработку - анализируете JSON, сохраняете его в базе данных и все остальное, что вам нужно.

Если вы хотите проверить X-Hub-Signature, вы можете либо сделать это между шагами 1 и 2, либо передать этот заголовок задаче и проверить подпись на шаге 4.

person Igor    schedule 24.10.2012
comment
Даже не думал об этом в таком ключе. Спасибо, сир! Попробовал бы заставить это работать сегодня таким образом. - person Hick; 25.10.2012

Вы можете использовать tornado.wsgi для интеграции Tornado с другими фреймворками, совместимыми с WSGI. Подробности смотрите в этом демонстрационном проекте:

https://github.com/bdarnell/django-tornado-demo

person mher    schedule 23.10.2012
comment
Это решение медленное, так как Django и WSGI синхронны, а такие вызовы, как запросы к БД, заблокируют весь сервер торнадо. См. ответ @graham-dumpleton - person Igor; 24.10.2012