Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Wysyłanie wiadomości do grup w Django Channels 2

Podczas pisania tych pytań znalazłem rozwiązanie i pomyślałem, że ktoś inny też może z niego skorzystać! Ponieważ większość pytań tutaj dotyczy wersji kanałów przed 2.0 i nowszymi, w ten sposób powinieneś obsługiwać zdarzenia group_send w swoich klientach.

Problem nie polegał tylko na tym, jak użyłem group_send jednak błędnie założyłem, że dodanie zmiennej klasy groups do mojego EventConsumer powinno automatycznie dodać ją do tej/tych grup, NIE! Musisz dodać grupy ręcznie w connect funkcja klasy i usuwanie grup w disconnect funkcja!

Problem polegał również na tym, że mój konsument nie miał określonych odpowiednich programów obsługi zdarzeń. W moim pliku widoku, w którym pobierane jest żądanie alarmu, ustawiłem „typ” na „test”. Test nie został odzwierciedlony w mojej klasie EventConsumer, więc zdarzenie nie mogło zostać przetworzone. Jak zauważono w przykładzie multiczatu w wierszu nr 146, funkcje pomocnicze są wywoływane w zależności od typu wysłanego zdarzenia. Zatem typ zdarzenia „event.alarm” powinien mieć odpowiednią funkcję event_alarm w Twoim konsumencie! Proste, ale nie tak dobrze udokumentowane :). Oto jak wyglądało ostateczne rozwiązanie:

W consumers.py , zwróć uwagę na group_add w connect i group_discard w rozłączeniu!

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 więc powyższa funkcja events_alarm jest wywoływany z następującego 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>')

Daj mi znać, jeśli potrzebujesz więcej wyjaśnień do pytania/odpowiedzi! Pozdrawiam!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Rails Redis ustawia maxmemory i maxmemory-policy

  2. Błąd integracji Redis z JHipster CacheConfiguration

  3. DisabledBackend:nieprawidłowe zachowanie z selerem, redis i flask

  4. phpredis na Windows 7 64bit xampp

  5. Używanie nginx do obsługi treści bezpośrednio z pamięci podręcznej redis