Приложение чата django, использующее redis - как / где я могу «прослушивать» сообщения после подписки? - PullRequest
1 голос
/ 15 октября 2011

Итак, я пытаюсь написать систему чата с использованием django (я относительно новичок в системе реального времени). Я провел некоторое исследование - есть много вариантов (витые, торнадо и т. Д.), Но сейчас я решил попробовать использовать nginx в качестве веб-сервера и паба redis.

Чат будет между двумя пользователями одновременно.

Вот о чем я думал:

  1. При аутентификации все пользователи выдают psubscribe chatctrl: * :. Это по существу подписывается на канал управления, чтобы установить начальный диалог, который всегда необходим

  2. Когда пользователь u1 запускает чат с пользователем u2, мы

  3. создайте канал, скажите «chat: u1: u2» и подпишитесь на него.

  4. Пользователь u1 публикует сообщение на контрольном канале chatctrl: u1: u2: (управляющее сообщение, которое прослушивает u2) эффективно говорит: «Вы хотите поговорить со мной на канале» chat: u1 : u2"

  5. Пользователь u2 должен получить это сообщение, подписаться на канал и ответить «да» через другое сообщение на канале управления (или на вновь созданном канале.
  6. Сеанс установлен, и оба пользователя могут публиковать на одном и том же канале и прослушивать его.

Мой вопрос: 1. Имеет ли вышесказанное смысл, прежде всего? Если нет, то как бы вы сделали это с помощью Redis? 2. Второй вопрос: куда мне поставить цикл для прослушивания сообщений? Так как это будет «блокировка», когда нет сообщений, он не может перейти в представление или в модель, к которой обращается представление. Должен ли он быть в порожденной теме, и если да, то как мне отписаться после окончания сеанса чата?

Thanx!

1 Ответ

0 голосов
/ 10 сентября 2012

См. Мой ответ здесь для примера системы, которую вы описываете.

В этом коде представление порождает гринлет Gevent, который подписывается на Redis и отправляет сообщения в браузер клиента через socket.io.

Представление затем блокируется до тех пор, пока не будет получено сообщение через socket.io, повторяющееся в течение сеанса чата.

Надеюсь, это поможет!

...