Счетчик посетителей канала 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, и не забывать фактически увеличивать его.