Django Channels: Отправка сообщения извне класса потребителя
Я новичок в Python и Django,
.
В настоящее время мне нужно настроить WebSocket сервер, используя Channels.
Я следую коду, приведенному в этой ссылке: Отправка сообщения с помощью Django Channels извне класса Consumer
setting.py
ASGI_APPLICATION = 'myapp.asgi.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels.layers.InMemoryChannelLayer',
},
}
Вот код Consumer
import json
from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync
class ZzConsumer(WebsocketConsumer):
def connect(self):
self.room_group_name = 'test'
async_to_sync(self.channel_layer.group_add)(
self.room_group_name,
self.channel_name
)
self.accept()
def disconnect(self, code):
async_to_sync(self.channel_layer.group_discard)(
self.room_group_name,
self.channel_name
)
print("DISCONNECED CODE: ",code)
def receive(self, text_data=None, bytes_data=None):
print(" MESSAGE RECEIVED")
data = json.loads(text_data)
message = data['message']
async_to_sync(self.channel_layer.group_send)(
self.room_group_name,
{
"type": 'chat_message',
"message": message
}
)
def chat_message(self, event):
print("EVENT TRIGERED")
# Receive message from room group
message = event['message']
# Send message to WebSocket
self.send(text_data=json.dumps({
'type': 'chat',
'message': message
}))
А за пределами потребителя:
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)(
'test',
{
'type': 'chat_message',
'message': "event_trigered_from_views"
}
)
Ожидаемая логика заключается в том, что я могу получить данные из group_send
в receive
на классе Consumer. Таким образом, я могу отправить сообщение клиенту.
Однако это не так.
Может ли кто-нибудь здесь знать, чего мне не хватает?
Любая помощь будет очень признательна.
Спасибо!
Обновлено:
routing.py
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'ws/socket-server/', consumers.ZzConsumer.as_asgi())
]
Мне кажется, вам не хватает аргумента type
в методе chat_message
. Он должен соответствовать типу в group_send
. То есть:
def chat_message(self, event, type='chat_message'):
print("EVENT TRIGERED")
Совпадения:
async_to_sync(channel_layer.group_send)(
'test',
{
'type': 'chat_message',
'message': "event_trigered_from_views"
}
)