sql >> Database >  >> NoSQL >> Redis

Berichten verzenden naar groepen in Django Channels 2

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!



  1. Versleuteling gebruiken om uw MongoDB-gegevens te beschermen

  2. Handleiding voor het gebruik van Apache HBase-poorten

  3. Meteor, definieer collecties dynamisch

  4. MongoDB $add