Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Mengirim pesan ke grup di Django Channels 2

Saya menemukan solusinya saat menulis pertanyaan ini dan berpikir bahwa orang lain mungkin juga memanfaatkannya! Karena sebagian besar pertanyaan di sini adalah tentang saluran versi sebelum 2.0 dan di atasnya, ini adalah bagaimana Anda harus menangani peristiwa group_send di konsumen Anda.

Masalahnya tidak hanya terletak pada cara saya menggunakan group_send fungsi meskipun, saya salah berasumsi bahwa menambahkan variabel kelas grup ke EventConsumer saya harus secara otomatis menambahkannya ke grup itu/itu, TIDAK! Anda harus menambahkan grup secara manual di connect fungsi kelas dan hapus grup di disconnect fungsi!

Masalahnya kemudian juga terletak pada bahwa konsumen saya tidak memiliki penangan acara yang tepat. Dalam file tampilan saya, tempat permintaan alarm diambil, saya telah mengatur 'ketik' ke 'pengujian'. Tes tidak tercermin di kelas EventConsumer saya sehingga acara tidak dapat diproses. Seperti yang dicatat dalam contoh multichat di sini pada baris nomor 146, fungsi pembantu dipanggil tergantung pada jenis acara yang dikirim. Jadi jenis acara 'event.alarm' harus memiliki fungsi event_alarm yang sesuai di konsumen Anda! Sederhana, tetapi tidak didokumentasikan dengan baik :). Inilah solusi akhirnya:

Di consumers.py , perhatikan group_add di connect dan group_discard terputus!

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

Jadi, fungsi di atas events_alarm dipanggil dari group_send berikut :

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

Tolong beri tahu saya jika Anda memerlukan klarifikasi lebih lanjut untuk pertanyaan/jawaban! Semangat!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mengapa penggunaan memori redis tidak berkurang ketika del setengah dari kunci

  2. Bagaimana cara membuat kunci terdistribusi dengan Redis?

  3. Bagaimana ConnectionMultiplexer menangani pemutusan?

  4. Migrasi phpRedis ke cluster dan hashing yang konsisten

  5. Redis adalah utas tunggal. Lalu mengapa saya harus menggunakan selada?