Проблема отправки сообщений в группу каналов в 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, где я пытаюсь передать событие остальным членам команды.