sql >> Database teknologi >  >> NoSQL >> Redis

Sende beskeder til grupper i Django Channels 2

Jeg fandt løsningen, mens jeg skrev dette spørgsmål og tænkte, at en anden måske også kunne bruge den! Da de fleste af spørgsmålene herude handler om kanalversioner før 2.0 og nyere, er det sådan, du skal håndtere group_send-begivenheder hos dine forbrugere.

Problemet lå ikke kun i, hvordan jeg brugte group_send funktion, men jeg havde fejlagtigt antaget, at tilføjelse af grupper-klassevariablen til min EventConsumer automatisk skulle tilføje den til den/de grupper, det gør den IKKE! Du skal tilføje grupper manuelt i connect klassefunktion og fjern grupper i disconnect funktion!

Problemet lå da også i, at min forbruger ikke havde ordentlige hændelseshandlere specificeret. I min view-fil, hvor alarmanmodningen er taget ind, havde jeg sat 'type' til 'test'. Test blev ikke afspejlet i min EventConsumer-klasse, så begivenheden kunne ikke behandles. Som nævnt i multichat-eksemplet her på linje nummer 146, bliver hjælpefunktionerne kaldt afhængigt af typen af ​​den sendte begivenhed. Så en hændelsestype af 'event.alarm' bør have en tilsvarende funktion af event_alarm hos din forbruger! Simpelt, men ikke så veldokumenteret :). Sådan så den endelige løsning ud:

I consumers.py , bemærk group_add i forbindelse og group_discard i afbrydelse!

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å ovenstående funktion events_alarm bliver kaldt fra følgende 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>')

Sig venligst til, hvis du har brug for flere afklaringer på spørgsmålet/svaret! Skål!



  1. Opretter du forbindelse til mongodb gennem browseren?

  2. Unik scoring for Redis leaderboard

  3. Hvordan kan jeg tilføje et unikt id med to kolonner til mongodb i en meteor-app?

  4. ønsker at køre redis-server i baggrunden nonstop