Django 频道实时访客计数器
Django channel visitor counter realtime
我正在尝试使用 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
}))
这是路由:
websocket_urlpatterns = [
re_path(r'ws/visitors/$', consumers.VisitorConsumer),
]
我不明白为什么它总是触发 0。
谁能帮忙解决这个问题?
我看不到你在哪里递增 user_count 但即使你递增它也可能不起作用,因为不同工作人员中的消费者 运行 的不同实例将无法访问到相同的 user_count 变量。所以你应该将它存储在像 Redis 或 DB 这样的缓存中并且不要忘记实际增加它
我正在尝试使用 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
}))
这是路由:
websocket_urlpatterns = [
re_path(r'ws/visitors/$', consumers.VisitorConsumer),
]
我不明白为什么它总是触发 0。
谁能帮忙解决这个问题?
我看不到你在哪里递增 user_count 但即使你递增它也可能不起作用,因为不同工作人员中的消费者 运行 的不同实例将无法访问到相同的 user_count 变量。所以你应该将它存储在像 Redis 或 DB 这样的缓存中并且不要忘记实际增加它