Использование сервера Centrifuge для сокет-сообщений.

Видео отсутствует

Использование сервера Centrifuge для сокет-сообщений.

Установка сервера.

link to download

Загружаем centrifugo_2.5.1_linux_386.tar.gz под Ubuntu.

Распаковываем архив.

Следующей командой генерируем конфигурационный файл.

./centrifugo genconfig

Запуск сервера с веб-интерфейсом на 9999 порту.

./centrifugo --config=config.json -p 9999 --log_level=debug --admin

Вид веб-интерфейса.

admin

admin

admin

Генерация jwt токена для python клиента.

pip install pyjwt

Создадим маленький скриптик генерации gettoken.py

import jwt

token = jwt.encode({"sub": "42"}, "41355f96-1c88-468e-862f-db1e7546281e").decode()

print(token)

Где 1355f96-1c88-468e-862f-db1e7546281e берем из ранее сгенерированных настроек центрифуги config.json.

Отправка сообщения в центрифугу.

pip install cent

from cent import Client

url = "http://localhost:9999"
api_key = "e904b803-f695-4286-8af1-063b346a3955"

client = Client(url, api_key=api_key, timeout=1)
channel = "news"
data = {"input": "test"}
client.publish(channel, data)

Создадим класс клиента backend/backend/cent_client.py.

from cent import Client

from backend.settings import CENT_URL, CENT_KEY


class CentClient(object):

    def __init__(self):
        print('Init connection')
        self.con = Client(CENT_URL, api_key=CENT_KEY, timeout=1)

    def send(self,token,message):
        self.con.publish(token, message)

Используем этот класс в модели для отправки сообщения.

from backend.cent_client import CentClient
...
@app.task
def send_chat_message(id):
    ...
    for user in room.get_participants():
        token, created = Token.objects.get_or_create(user=user)
        payload =  { \
                    'type': 'chat_message', \
                    'message': ChatRoomMessageSerializer(message).data \
                   }       
        cent_client.send(token.key, payload)

Команда теста отправки.

from django.core.management.base import BaseCommand, CommandError
from backend.cent_client import CentClient
cent_client = CentClient()

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Test centrifugo...')

        data = {"input": "test"}
        cent_client.send('testtoken', data)
Задать вопрос, прокомментировать.