Jag hittade lösningen när jag skrev den här frågan och tänkte att någon annan också skulle kunna använda den! Eftersom de flesta av frågorna här ute handlar om kanalversioner före 2.0 och högre, är det så här du ska hantera group_send-händelser hos dina konsumenter.
Problemet låg inte bara i hur jag använde group_send
funktion dock, jag hade felaktigt antagit att lägga till klassvariabeln grupper till min EventConsumer automatiskt skulle lägga till den till den/de där grupperna, det gör den INTE! Du måste lägga till grupper manuellt i connect
klassfunktionen och ta bort grupper i disconnect
funktion!
Problemet låg då också i att min konsument inte hade ordentliga händelsehanterare specificerade. I min vyfil, där larmförfrågan tas in, hade jag ställt in 'typ' på 'test'. Testet återspeglades inte i min EventConsumer-klass så händelsen kunde inte bearbetas. Som noterats i multichattexemplet här på rad nummer 146 anropas hjälpfunktionerna beroende på vilken typ av händelse som skickas. Så en händelsetyp av 'event.alarm' bör ha en motsvarande funktion för event_alarm
hos din konsument! Enkelt, men inte så väldokumenterat :). Så här såg den slutliga lösningen ut:
I consumers.py
, notera group_add
in connect och group_discard
i urkoppling!
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å, ovanstående funktion events_alarm
anropas från följande 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>')
Meddela mig gärna om du behöver ytterligare förtydliganden till frågan/svaret! Skål!