Jeg fandt løsningen, mens jeg skrev dette spørgsmål og tænkte, at en anden måske også kunne bruge den! Da de fleste af spørgsmålene herude handler om kanalversioner før 2.0 og nyere, er det sådan, du skal håndtere group_send-begivenheder hos dine forbrugere.
Problemet lå ikke kun i, hvordan jeg brugte group_send
funktion, men jeg havde fejlagtigt antaget, at tilføjelse af grupper-klassevariablen til min EventConsumer automatisk skulle tilføje den til den/de grupper, det gør den IKKE! Du skal tilføje grupper manuelt i connect
klassefunktion og fjern grupper i disconnect
funktion!
Problemet lå da også i, at min forbruger ikke havde ordentlige hændelseshandlere specificeret. I min view-fil, hvor alarmanmodningen er taget ind, havde jeg sat 'type' til 'test'. Test blev ikke afspejlet i min EventConsumer-klasse, så begivenheden kunne ikke behandles. Som nævnt i multichat-eksemplet her på linje nummer 146, bliver hjælpefunktionerne kaldt afhængigt af typen af den sendte begivenhed. Så en hændelsestype af 'event.alarm' bør have en tilsvarende funktion af event_alarm
hos din forbruger! Simpelt, men ikke så veldokumenteret :). Sådan så den endelige løsning ud:
I consumers.py
, bemærk group_add
i forbindelse og group_discard
i afbrydelse!
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']
}
)
Så ovenstående funktion events_alarm
bliver kaldt fra følgende 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>')
Sig venligst til, hvis du har brug for flere afklaringer på spørgsmålet/svaret! Skål!