I have created custom Middleware in users/middleware.py
file. Till yesterday, the request was terminating after middleware return HttpResponseRedirect. but today the request keeps continuing and reloads the profile page. below is my middleware.py file. I am using Django 2.1.7
from django.utils.deprecation import MiddlewareMixin
import pytz
from django.urls import reverse_lazy , reverse
from django.utils import timezone
from django.http import HttpResponse ,HttpResponseRedirect
class TimezoneMiddleware(MiddlewareMixin):
def process_request(self, request):
request.session['timezone'] = 'Asia/Kolkata'
timezone.activate(pytz.timezone('Asia/Kolkata'))
class CheckProfileMiddleware(MiddlewareMixin):
def process_request(self,request):
if request.user.first_name == "" or request.user.last_name == "":
if 'profile' not in request.path_info:
request.session['is_incomplete']=1
# return HttpResponse("ok")
return HttpResponseRedirect(reverse('profile'))
else:
request.session['is_incomplete']=0
return None
basically I want to redirect the user to the profile page if his profile is incomplete. below are my middleware in setings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'users.middleware.TimezoneMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'users.middleware.CheckProfileMiddleware',
]
When I use return HttpResponse
it stops execution but it continue execution on HttpResponseRedirect
here is my URLConf.
path('profile/', profile, name='profile'),
my view.py
@login_required
def profile(request):
user= User.objects.get(id=request.user.id)
user_profile = Profile.objects.get(user_id=request.user.id)
if request.method == 'POST':
u_form = UserUpdateForm(request.POST,instance=request.user)
p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, f' Your Profile has been updated!')
return redirect('profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context={
'profile' : profile,
'u_form': u_form,
'p_form': p_form,
'users':user,
}
return render(request,'profile.html', context)
Actually I found the solution. The culprit was AJAX request. On each page AJAX is called simultaneously with page load. So whenever AJAX is called Middleware was considering as GET request and again redirects to profile
view. So I put the condition in Middleware to avoid if it is an AJAX request. my updated middleware.py
class CheckProfileMiddleware(MiddlewareMixin):
def process_request(self,request):
if request.user.is_authenticated:
if not request.path.startswith(settings.STATIC_URL):
if request.user.first_name == "" or request.user.last_name == "":
if ('profile' not in request.path_info) and (not request.is_ajax()):
request.session['is_incomplete']=1
return HttpResponseRedirect(reverse('profile'))
else:
request.session['is_incomplete']=0