sql >> Databasteknik >  >> NoSQL >> Redis

Skicka meddelanden till grupper i Django Channels 2

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!



  1. Om MongoDB, varför använder vi det? MongoDB:s terminologi och implementering

  2. Grupp efter summa mongodb

  3. Vad är skillnaden mellan metoden insert(), insertOne() och insertMany()?

  4. 9 ClusterControl-funktioner som du inte hittar i andra databashanteringsverktyg