Счетчик посетителей канала Django в реальном времени

Я пытаюсь показать счетчик посетителей в реальном времени с помощью django. например, сколько посетителей онлайн на моем веб-сайте.

Я написал потребителя веб-сокетов, но он всегда дает мне 0, даже если я открываю сайт в нескольких браузерах.

это мой канал django потребляет:

class VisitorConsumer(WebsocketConsumer):
    user_count = 0
    def connect(self):
        self.room_name = 'visitors'
        self.room_group_name = 'counter_%s' % self.room_name

        # Join room group
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

         # Send message to room group
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name,
            {
                'type': 'send_visitor_count',
                'count': self.user_count
            }
        )

        self.accept()

    def disconnect(self, close_code):
        # Leave room group
        async_to_sync(self.channel_layer.group_discard)(
            self.room_group_name,
            self.channel_name
        )
       

    # Receive message from room group
    def send_visitor_count(self, event):
        count = event['count']

        # Send message to WebSocket
        self.send(text_data=json.dumps({
            'count': count
        }))

и это маршрутизация:

websocket_urlpatterns = [
    re_path(r'ws/visitors/$', consumers.VisitorConsumer),
]

Я не понимаю, почему он всегда стреляет 0.

Кто-нибудь может помочь исправить это?

1 ответ

Решение

Я не вижу, где вы увеличиваете user_count, но даже это может не сработать, если вы увеличите его, потому что разные экземпляры потребителя, работающие в разных воркерах, не будут иметь доступа к одной и той же переменной user_count. Поэтому вы должны хранить его в кеше, таком как Redis или DB, и не забывать фактически увеличивать его.

Другие вопросы по тегам