Проблема отправки сообщений в группу каналов в Django

Я создал систему с моделями пользователя, члена и команды. С помощью сокетов я пытаюсь добиться того, чтобы один из членов команды уведомлял всех членов команды о своем достижении.

Clientside:

  • Svelte 4.2.7 API:
  • Django 4.2.11
  • Channels 4.1.0

Просто чтобы проверить логику работы сокета, во фронтенде при подключении я отправляю тестовое сообщение на сервер:

function createWebSocket() {
    const { subscribe, set } = writable(undefined);

    
    return {
        subscribe,
        connect() {
            const gameSocket: WebSocket = new WebSocket('ws://' + "localhost:8000" + '/ws/game/');
            
          
            gameSocket.onmessage = (e) => {
                const data = JSON.parse(e.data);
                const message = data['message'];
                console.log("socket message", message);
            };
    
            gameSocket.onclose = (e) => {
                console.log("socket closed unexpectedly");
                console.log(e);
                
            };
    
            gameSocket.onopen = () => {
                console.log("socket connected");
                this.sendMessage("Test hello!")
                
            }
    
            set(gameSocket);
        },
        sendMessage: (message: any) => {
            subscribe((gameSocket) => {
                if (gameSocket !== null) {
                    gameSocket.send(JSON.stringify({ 'message': message }));
                }
            })();
        }
    };
}

export const gameSocket = createWebSocket(); 

В django я подключился к redis:

 CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)]
        }
    }
}

my asgi.py:

import os

import game.routing

from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'game.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter([
            # god knows why i need a fkn star h
            *game.routing.websocket_urlpatterns
    ])
    )
})

routing.py

from django.urls import path
from game.consumers import GameConsumer

websocket_urlpatterns = [
        path('ws/game/', GameConsumer.as_asgi()),


]

и, наконец, мой consumer.py, где я в настоящее время просто жестко кодирую название группы в team_1. Моя проблема в том, что моя функция-обработчик "chat_message" никогда не вызывается и не выводит "сообщение команды" в консоль.

class GameConsumer(JsonWebsocketConsumer):
    def connect(self):
        print(f"Trying to connect to socket with user {self.scope['user']}")
        if self.scope['user'].id:
            print("success")
            # Get all teams user is a part of
            teams = Team.objects.filter(member__user=self.scope['user'].id)
            # Join some kind of room or something, one room for each existing team
            self.accept()

            for team in teams:
                group_name = f"team_1"
                print(team)
                async_to_sync(self.channel_layer.group_add(
                    group_name,
                    self.channel_name
                ))
                print(f"added to group {group_name}")
        else:
            print("User not signed in")

    def receive(self, text_data=None):
        print("got message from client")
        print(text_data)
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        #teams = Team.objects.filter(member__user=self.scope['user']).first()
        async_to_sync(self.channel_layer.group_send)(
            "team_1",
            {
                "type": "chat.message",
                "message": message
            }
        )
        print("sendt msg to all users in team")

    def chat_message(self, event):
        print("team message")
        print(event)
        message = event['message']
        self.send(text_data=json.dumps({
            'message': message
        }))

Мой клиент регистрирует "сокет подключен"

А журналы моего сервера:

 Trying to connect to socket with user b@c.com
success
WebSocket CONNECT /ws/game/ [127.0.0.1:49405]
Team object (1)
added to group team_1
got message from client
{"message":"Test hello!"}
sendt msg to all users in team

Итак, похоже, что он получает сообщение от клиента, но не проходит дальше async_to_sync, где я пытаюсь передать событие остальным членам команды.

Вернуться на верх