I am trying to use a custom Middleware to restrict page access when the user is not authenticated. I have defined a list of URLs in 'settings.py' which are supposed to be exempted from this restriction. But when I try to access any page, I get an 'ERR_TOO_MANY_REDIRECTS' error. Please feel to ask for more clarification and code references if required.
settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'accounts.middleware.LoginRequiredMiddleware',
]
LOGIN_URL = 'home'
LOGIN_REDIRECT_URL = '/'
LOGIN_EXEMPT_URLS = [
r'^accounts/login/$',
r'^accounts/register/$',
r'^accounts/logout/$',
]
middleware.py
import re
from django.conf import settings
from django.shortcuts import redirect
EXEMPT_URLS = []
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
EXEMPT_URLS += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS]
class LoginRequiredMiddleware:
def __init__(self, get_response):
print('inside init')
self.get_response = get_response
def __call__(self, request):
print('inside call')
response = self.get_response(request)
return response
def process_view(self, request, view_func, view_args, view_kwargs):
print('inside view_process')
path = request.path_info.lstrip('/')
print(path)
#assert hasattr(request, 'user')
if not request.user.is_authenticated:
print('user not authenticated')
if not any(url.match(path) for url in EXEMPT_URLS):
print('redirecting to login url')
return redirect(settings.LOGIN_URL)
urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name = 'home'),
path('product', views.product, name = 'product'),
path('createOrder', views.createOrder, name = 'createOrder'),
path('updateOrder/<str:pk>', views.updateOrder, name = 'updateOrder'),
path('deleteOrder/<str:pk>', views.deleteOrder, name = 'deleteOrder'),
path('register', views.register, name = 'register'),
path('login', views.login, name = 'login'),
path('logout', views.logout, name = 'logout')
]
Just replace your middleware with the following: