Ik vond de oplossing tijdens het schrijven van deze vraag en dacht dat iemand anders er ook gebruik van zou kunnen maken! Aangezien de meeste vragen hier gaan over kanaalversie ouder dan 2.0 en hoger, is dit hoe u group_send-gebeurtenissen bij uw consumenten moet behandelen.
Het probleem lag niet alleen in hoe ik de group_send
. gebruikte functie echter, had ik ten onrechte aangenomen dat het toevoegen van de groepsklassevariabele aan mijn EventConsumer deze automatisch aan die / die groepen zou moeten toevoegen, maar dat doet het NIET! U moet handmatig groepen toevoegen in de connect
class-functie en verwijder groepen in de disconnect
functie!
Het probleem lag toen ook in het feit dat mijn consument geen juiste gebeurtenishandlers had opgegeven. In mijn viewfile, waar het alarmverzoek binnenkomt, had ik het 'type' op 'test' gezet. Test werd niet weerspiegeld in mijn EventConsumer-klasse, dus de gebeurtenis kan niet worden verwerkt. Zoals opgemerkt in het multichat-voorbeeld hier op regel 146, worden de helperfuncties aangeroepen afhankelijk van het type gebeurtenis dat wordt verzonden. Dus een gebeurtenistype van 'event.alarm' moet een overeenkomstige functie hebben van event_alarm
bij uw consument! Eenvoudig, maar niet zo goed gedocumenteerd :). Zo zag de uiteindelijke oplossing eruit:
In consumers.py
, let op de group_add
in connect en de group_discard
verbroken!
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']
}
)
Dus de bovenstaande functie events_alarm
wordt gebeld door de volgende 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>')
Laat het me weten als je meer uitleg nodig hebt over de vraag/het antwoord! Proost!