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

#django #python-asyncio #django-channels #django-socketio

#django #python-asyncio #django-каналы #django-socketio

Вопрос:

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

Я написал пользователя websocket, но он всегда выдает мне 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
        }))
  

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

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

Я не понимаю, почему он всегда запускает 0.

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

Ответ №1:

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