Search code examples
pythondjangodjango-templatesdjango-viewsdjango-middleware

Request continue even after redirect through Django Middleware


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)

Solution

  • 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