Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Gửi tin nhắn đến các nhóm trong Django Channels 2

Tôi đã tìm ra giải pháp khi viết câu hỏi này và nghĩ rằng ai đó cũng có thể sử dụng nó! Vì hầu hết các câu hỏi ở đây là về phiên bản kênh trước 2.0 trở lên, đây là cách bạn nên xử lý các sự kiện group_send trong người tiêu dùng của mình.

Vấn đề không chỉ nằm ở cách tôi sử dụng group_send mặc dù vậy, tôi đã giả định sai rằng việc thêm biến lớp nhóm vào EventConsumer của tôi sẽ tự động thêm nó vào đó / những nhóm đó, điều đó KHÔNG! Bạn phải thêm nhóm theo cách thủ công trong connect chức năng lớp và xóa các nhóm trong disconnect chức năng!

Vấn đề sau đó cũng nằm ở chỗ người tiêu dùng của tôi không có trình xử lý sự kiện thích hợp được chỉ định. Trong tệp chế độ xem của tôi, nơi yêu cầu cảnh báo được thực hiện, tôi đã đặt 'loại' thành 'kiểm tra'. Kiểm tra không được phản ánh trong lớp EventConsumer của tôi nên không thể xử lý sự kiện. Như đã lưu ý trong ví dụ đa kết nối ở đây trên dòng số 146, các hàm trợ giúp được gọi tùy thuộc vào loại sự kiện được gửi. Vì vậy, loại sự kiện 'event.alarm' phải có chức năng tương ứng là event_alarm trong người tiêu dùng của bạn! Đơn giản, nhưng không được ghi chép đầy đủ :). Đây là giải pháp cuối cùng trông như thế nào:

Trong consumers.py , lưu ý group_add trong kết nối và group_discard ngắt kết nối!

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

Vì vậy, hàm trên events_alarm được gọi từ group_send sau :

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

Vui lòng cho tôi biết nếu bạn cần làm rõ thêm bất kỳ câu hỏi / câu trả lời nào! Chúc mừng!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. docker:MISCONF Redis được định cấu hình để lưu ảnh chụp nhanh RDB

  2. DisabledBackend:Hành vi bất thường với Celery, Redis &Flask

  3. Có một Java có thể nhúng thay thế cho Redis không?

  4. Redis:đưa ra các nguồn cấp tin tức trong danh sách hoặc tập hợp được sắp xếp?

  5. redis lua script so với các cuộc gọi đơn lẻ