Reputation: 95
I am trying to do login/logout using Django Middleware. I have gone through few tutorials but all are posted with old versions. I am trying to hardcode the except function inside middleware instead of having in setting.py as follow:
middleware.py:
EXEMPT_FUNC = ['Accounts:login', 'Accounts:logout', 'Accounts:register']
class LoginRequiredMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_view(self, request, view_func, view_args, view_kwargs):
assert hasattr(request, 'user')
path = request.path_info.lstrip('/')
url_is_exempt = any(url.match(path) for url in EXEMPT_FUNC)
if path == reverse('Accounts:logout').lstrip('/'):
logout(request)
if request.user.is_authenticated() and url_is_exempt:
return redirect('User:home')
elif request.user.is_authenticated() or url_is_exempt:
return None
else:
return redirect('Accounts:login')
url.py:
app_name = 'Accounts'
urlpatterns = [
path('login', views.login_view, name='login'),
path('logout', views.logout_view, name='logout'),
path('register', views.register_view, name='register')
]
Above code is not working as intended, please help on what am I doing wrong.
Really appreciate your help.
Upvotes: 0
Views: 913
Reputation: 95
Finally its working. Here is what I changed.
middleware.py:
import re
from django.conf import settings
from django.urls import reverse
from django.shortcuts import redirect
from django.contrib.auth import logout
from Accounts import views
EXEMPT_PATH = ['login', 'logout', 'register']
class LoginRequiredMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_view(self, request, view_func, view_args, view_kwargs):
assert hasattr(request, 'user')
path = request.path_info.lstrip('/')
exempt = False
if path in EXEMPT_PATH:
exempt = True
if path == 'logout':
logout(request)
if request.user.is_authenticated and exempt:
return redirect('User:home')
elif request.user.is_authenticated or exempt:
return None
else:
return redirect('Accounts:login')
With this approach I don't need to modify settings.py.
I hope this helps.
Upvotes: 1