I am developing a page with Django and I had one interesting requirement: limit the number of users. The idea is to let a fixed number of users use the site and show a message telling the others to wait. I will like to share how I did it.
We need to check in every view used by a user. Instead of repeating the same code, the easiest way is to add a decorator for each function. Is really similar to AoP.
decorators.py:
from django.conf import settings from django.shortcuts import redirect MAX_NUMBERS_OF_USERS = getattr(settings, 'MAX_NUMBERS_OF_USERS', 100) def check_user(view_function): def _wrapped_view_func(request, *args, **kwargs): auth_user = request.user if auth_user.id <= MAX_NUMBERS_OF_USERS: return view_function(request, *args, **kwargs) return redirect('coming_soon') return _wrapped_view_func
views.py:
from app.decorators import check_user from django.contrib.auth.decorators import login_required from django.shortcuts import render @login_required @check_user def restricted_view(request): #Do stuff def coming_soon(request): return render(request, 'coming_soon.html', {})
And that’s it ! Easy, clean and simple ! You can do more complex stuffs like logging.