Во-первых, вам нужен ваш потребительский экземпляр, чтобы подписаться на группу.
from asgiref.sync import async_to_sync
class GameConsumer(WebsocketConsumer):
def connect(self):
self.accept()
self.render()
async_to_sync(self.add_group)('render_updates_group')
controller.startTurn()
...
Тогда, если вы находитесь за пределами своего потребителя, вам нужно будет отправить сообщение этой группе, чтобы все потребители, которые зарегистрировались в этой группе, получили сообщение.
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
def sendDeployments(owner, armies):
type = "renderDeployments"
message = owner + " has " + str(armies) + " to deploy"
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)(
'render_updates_group',
{'type': 'render', 'message': message}
)
Однако вам также нужно помнить об удалении своего потребителя из группы при его отключении.
class GameConsumer(WebsocketConsumer):
....
def disconnect(self, close_code):
async_to_sync(self.group_name)('render_updates_group')
Если вы хотите ограничить, какие открытые соединения получают это сообщение рендеринга, вам необходимо соответствующим образом создать имя группы.
Например, если вы думаете о какой-то онлайн-игре, возможно, вы включили MATCH-ID
в название группы, которое используется всеми подключениями для одного и того же матча.
Хорошая ссылка на этодокументация Channel Layers , но помните, что при запуске в рабочей среде вам понадобится настроить уровень сообщений (обычно Redis).