Намерих решението, докато пишех тези въпроси и си помислих, че някой друг може да го използва! Тъй като повечето от въпросите тук са за версия на канали преди 2.0 и по-нова, това е начинът, по който трябва да се справяте със събития group_send във вашите потребители.
Проблемът не се крие само в това как използвах group_send
функция обаче, погрешно бях предположил, че добавянето на променливата на класа групи към моя EventConsumer трябва автоматично да я добави към тази/тези групи, НЕ! Трябва да добавяте групи ръчно в connect
class функция и премахване на групи в disconnect
функция!
Проблемът тогава също се крие в това, че моят потребител не е имал подходящи манипулатори на събития. Във файла за преглед, където се приема заявката за аларма, бях задал 'type' на 'test'. Тестът не беше отразен в моя клас EventConsumer, така че събитието не можеше да бъде обработено. Както е отбелязано в примера за мултичат тук на ред номер 146, помощните функции се извикват в зависимост от типа на изпратеното събитие. Така че тип събитие „event.alarm“ трябва да има съответна функция на event_alarm
във вашия потребител! Просто, но не толкова добре документирано :). Ето как изглеждаше окончателното решение:
В consumers.py
, обърнете внимание на group_add
в connect и group_discard
в прекъсване на връзката!
class EventConsumer(JsonWebsocketConsumer):
def connect(self):
async_to_sync(self.channel_layer.group_add)(
'events',
self.channel_name
)
self.accept()
def disconnect(self, close_code):
print("Closed websocket with code: ", close_code)
async_to_sync(self.channel_layer.group_discard)(
'events',
self.channel_name
)
self.close()
def receive_json(self, content, **kwargs):
print("Received event: {}".format(content))
self.send_json(content)
# ------------------------------------------------------------------------------------------------------------------
# Handler definitions! handlers will accept their corresponding message types. A message with type event.alarm
# has to have a function event_alarm
# ------------------------------------------------------------------------------------------------------------------
def events_alarm(self, event):
self.send_json(
{
'type': 'events.alarm',
'content': event['content']
}
)
И така, горната функция events_alarm
се извиква от следния group_send
:
from django.shortcuts import HttpResponse
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
def alarm(req):
layer = get_channel_layer()
async_to_sync(layer.group_send)('events', {
'type': 'events.alarm',
'content': 'triggered'
})
return HttpResponse('<p>Done</p>')
Моля, уведомете ме, ако имате нужда от още разяснения на въпроса/отговора! Наздраве!