#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, и не забудьте фактически увеличить его