August 16, 2012

November 25, 2019

Django - unique online visitors counter

I like watching usage statistics of my applications ;-) I have decided to show number of online users. Intranet. Access for logged anonymous and anonymous users. Simply code. I have been checking unique IP addresses. Everything is stored in memcached.

Add django.core.context_processors.request to TEMPLATE_CONTEXT_PROCESSORS.

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'django.core.context_processors.request',
)

Add OnlineNowMiddleware to MIDDLEWARE_CLASSES.

MIDDLEWARE_CLASSES = (
...
'project.onlineMiddleware.OnlineNowMiddleware',
)

Main OnlineNowMiddleware code.

from django.core.cache import cache
class OnlineNowMiddleware(object):
def process_request(self, request):
# Check the IP address
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
user_ip = x_forwarded_for.split(',')[0]
else:
user_ip = request.META.get('REMOTE_ADDR')
# Get the list of the latest online users
online = cache.get('online_now')
# Check the active IP addresses
if online:
online = [ip for ip in online if cache.get(ip)]
else:
online = []
# Add the new IP to cache
cache.set(user_ip, user_ip, 600)
# Add the new IP to list if doesn't exist
if user_ip not in online:
online.append(user_ip)
# Set the new online list
cache.set('online_now', online)
# Add the number of online users to request
request.__class__.online_now = len(online)

Finally, show the number of online users.

{{ request.online_now }}
© 2020 Przemysław Kołodziejczyk