/nodejs-socket_django_redis_demo

Пример реализации связки nodejs как сокет-сервера с django используя redis

Primary LanguagePython

Пример связки сокетов на nodejs/socket.io с django посредством redis

Пример реализации связки nodejs как сокет-сервера с django используя redis

Перед началом установите все зависимости. Должен быть установлен в системе virtualenv и nodejs. Также обязательно наличие запущенного redis сервера.

$ ./build_env.sh
$ cd nodejs
$ npm install

В чем суть?

Идея в том, что бы создать приложение которое будет работать в реалтайме по вебсокетам, но обязательно участие в этом всем django. Мы сделаем банальный чат, но по факту это можно использовать для, например нотификаций, когда пользователю приходит уведомление о каком-то событии которое сейчас сделал какой-то другой пользователь. Тоесть, когда django хочет сказать каким-то пользователям о том, что она сделала для другого пользователя :)

Как это работает?

У каждой сессии есть идентификатор, который обрабатывает django. Сокеты же обрабатываются через nodejs, а значит без привязки к сессии. Наша задача деанонимизировать сокеты для nodejs используя django сессии. При открытии сокета нам уже будет известна джанговская sessionid, остается только задать django вопросы про эту сессию и принять решение.

Когда клиент дергает что-то в сокет-сервере, nodejs должна будет выполнить обычный http запрос в django, передав ей все клиентские cookies. Таким образом, ответ который получит nodejs от django будет для конкретного пользователя в django-сессии :) а nodejs в данном случае выступит лишь в качестве проксирующего сервиса.

В случае, когда django захочет сказать клиенту через сокет что-то важное, мы будем использовать возможности redis - publish/subscribe. nodejs подпишется на канал, а django будет в него писать. Когда django что-то запишет в определенный канал в nodejs дернется коллбэк, в котором мы сможем обработать полученные данные и отправить их по назначению.

Почему все именно так?

Каждый инструмент под задачу. Django хороша для статики, nodejs отлична для реалтайма. Когда у нас есть проект написанный на django и нужно к нему добавить реалтайм, такой подход один из самых вменяемых с точки зрения простоты реализации, надежности и скорости внедрения/разработки.

Такой подход используется в продакшене весьма успешно, вот я и решил поделиться со всеми кому интересно готовым демонстрационным решением.

Описание кода

Я описал в бложике самый важный код тут, кому интересно вот: http://mrchex.blogspot.com/2013/08/django.html