Redis
 sql >> база данни >  >> NoSQL >> Redis

Изпращане на съобщения до групи в Django Channels 2

Намерих решението, докато пишех тези въпроси и си помислих, че някой друг може да го използва! Тъй като повечето от въпросите тук са за версия на канали преди 2.0 и по-нова, това е начинът, по който трябва да се справяте със събития group_send във вашите потребители.

Проблемът не се крие само в това как използвах group_send функция обаче, погрешно бях предположил, че добавянето на променливата на класа групи към моя EventConsumer трябва автоматично да я добави към тази/тези групи, НЕ! Трябва да добавяте групи ръчно в connect class функция и премахване на групи в disconnect функция!

Проблемът тогава също се крие в това, че моят потребител не е имал подходящи манипулатори на събития. Във файла за преглед, където се приема заявката за аларма, бях задал 'type' на 'test'. Тестът не беше отразен в моя клас EventConsumer, така че събитието не можеше да бъде обработено. Както е отбелязано в примера за мултичат тук на ред номер 146, помощните функции се извикват в зависимост от типа на изпратеното събитие. Така че тип събитие „event.alarm“ трябва да има съответна функция на event_alarm във вашия потребител! Просто, но не толкова добре документирано :). Ето как изглеждаше окончателното решение:

В consumers.py , обърнете внимание на group_add в connect и group_discard в прекъсване на връзката!

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

И така, горната функция events_alarm се извиква от следния 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>')

Моля, уведомете ме, ако имате нужда от още разяснения на въпроса/отговора! Наздраве!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Защо един екземпляр на джедаите не е нишки?

  2. Достигнати са максимални връзки за Azure Redis Cache

  3. Redistogo и Sidekiq на Heroku:Не мога да се свържа

  4. Кога да използвате хранилище за ключ/стойност, като Redis вместо/отстрани на SQL база данни?

  5. Не можете да получите резултат от Redis с помощта на Crud Repository в Spring Boot?