Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Senden von Nachrichten an Gruppen in Django Channels 2

Ich habe die Lösung gefunden, als ich diese Fragen geschrieben habe, und dachte, dass jemand anderes sie auch verwenden könnte! Da sich die meisten Fragen hier auf Kanalversionen vor 2.0 und höher beziehen, sollten Sie auf diese Weise mit group_send-Ereignissen in Ihren Verbrauchern umgehen.

Das Problem lag nicht nur darin, wie ich group_send verwendet habe Funktion, obwohl ich fälschlicherweise angenommen hatte, dass das Hinzufügen der Gruppenklassenvariablen zu meinem EventConsumer sie automatisch zu dieser/diesen Gruppen hinzufügen sollte, das tut es NICHT! Sie müssen Gruppen manuell im connect hinzufügen class-Funktion und entfernen Sie Gruppen im disconnect Funktion!

Das Problem lag dann auch darin, dass mein Konsument keine richtigen Event-Handler angegeben hatte. In meiner Ansichtsdatei, in der die Alarmanforderung aufgenommen wird, hatte ich den 'Typ' auf 'Test' gesetzt. Test wurde in meiner EventConsumer-Klasse nicht wiedergegeben, sodass das Ereignis nicht verarbeitet werden konnte. Wie im Multichat-Beispiel hier in Zeile 146 erwähnt, werden die Hilfsfunktionen je nach Art des gesendeten Ereignisses aufgerufen. Daher sollte ein Ereignistyp von 'event.alarm' eine entsprechende Funktion von event_alarm haben in Ihrem Verbraucher! Einfach, aber nicht so gut dokumentiert :). So sah die endgültige Lösung aus:

In consumers.py , beachten Sie die group_add in connect und die group_discard im Verbindungsabbruch!

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']
            }
        )

Also die obige Funktion events_alarm wird von folgendem group_send aufgerufen :

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>')

Bitte lassen Sie mich wissen, wenn Sie weitere Erläuterungen zu der Frage/Antwort benötigen! Prost!