from django.http import HttpResponseRedirect from django.conf import settings import re from django.urls import reverse, reverse_lazy EXEMPT_URLS = [ reverse('login'), reverse('logout'), ] EXEMPT_REGEX = re.compile('^/accounts/.*$') if hasattr(settings, 'LOGIN_EXEMPT_URLS'): EXEMPT_URLS += settings.LOGIN_EXEMPT_URLS """ Middleware that requires a user to be authenticated to view any page other than LOGIN_URL. Exemptions to this requirement can optionally be specified in settings via a list of regular expressions in LOGIN_EXEMPT_URLS (which you can copy from your urls.py). Requires authentication middleware and template context processors to be loaded. You'll get an error if they aren't. """ class LoginRequiredMiddleware(object): def __init__(self, get_response): self.get_response = get_response def __call__(self, request): if not request.user.is_authenticated: path = request.path_info # Check for any regex matches reg = EXEMPT_REGEX.match(path) if path not in EXEMPT_URLS and reg is None: login_uri = '%s?next=%s' % (settings.LOGIN_URL, request.path_info) return HttpResponseRedirect(login_uri) else: # I don't really like this but I don't really see a better # way of checking for this try: identity = request.user.identity except: allowed_paths = [ reverse('identity_create', kwargs={'user_id': request.user.pk}) ] allowed_paths.extend(EXEMPT_URLS) print(allowed_paths) if request.path_info not in allowed_paths: return HttpResponseRedirect(allowed_paths[0]) return self.get_response(request)