sql >> Databáze >  >> NoSQL >> Redis

Odesílání zpráv skupinám v Django Channels 2

Při psaní těchto otázek jsem našel řešení a myslel jsem, že by ho mohl využít i někdo jiný! Protože většina zde uvedených otázek se týká kanálů verze před 2.0 a vyšší, takto byste měli zacházet s událostmi group_send u vašich spotřebitelů.

Problém nespočíval pouze v tom, jak jsem použil group_send i když jsem chybně předpokládal, že přidání proměnné třídy skupin do mého EventConsumer by ji mělo automaticky přidat do této/těch skupin, to NE! Skupiny musíte přidat ručně v connect class a odstranit skupiny v disconnect funkce!

Problém pak také spočíval v tom, že můj spotřebitel neměl specifikované správné obslužné rutiny událostí. V mém souboru zobrazení, kde je přijat požadavek na alarm, jsem nastavil „typ“ na „test“. Test se neodrazil v mé třídě EventConsumer, takže událost nemohla být zpracována. Jak je uvedeno v příkladu multichatu zde na lince číslo 146, pomocné funkce jsou volány v závislosti na typu odeslané události. Typ události 'event.alarm' by tedy měl mít odpovídající funkci event_alarm ve vašem spotřebiteli! Jednoduché, ale ne tak dobře zdokumentované :). Takto vypadalo konečné řešení:

V consumers.py , poznamenejte si group_add v connect a group_discard v odpojení!

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

Takže výše uvedená funkce events_alarm je voláno z následujícího 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>')

Pokud potřebujete další vysvětlení k otázce/odpovědi, dejte mi prosím vědět! Na zdraví!



  1. 9 nových funkcí MongoDB – musíte se naučit ovládat MongoDB

  2. Porovnejte pole a vraťte rozdíl

  3. kanály bez kanálové vrstvy nebo jiného bezplatného hostingu

  4. MongoDB:jak analyzovat datum ve verzi 3.6 mongoDb?