/ programming

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 }}