Перенаправление на предыдущую страницу после входа в систему с помощью LoginRequiredMiddleware

Раньше я использовал next_param = request.POST.get('next') для перенаправления пользователей на предыдущую страницу после входа в систему.

Однако я решил пойти более сложным путем и теперь заставляю любого неаутентифицированного пользователя войти в систему, используя LoginRequiredMiddleware: пользователи автоматически перенаправляются на страницу входа, если они не аутентифицированы.

Это позволяет мне избежать необходимости вызывать decorator для всех представлений. Вместо этого укажите доступные представления, которые не требуют, чтобы пользователь вошел в систему.

Небольшая проблема: мой next_param = request.POST.get('next') не работает сейчас по очевидной причине: я не могу вставить ?next={{ request.path|urlencode}} на ссылающейся странице, так как перенаправление происходит автоматически и пользователю не нужно никуда кликать.

Какая альтернатива у меня есть, чтобы перенаправить пользователя на начальную/предыдущую страницу, на которую он перешел до автоматического перенаправления?

base.py

MIDDLEWARE = [
..
    'mysite.middleware.LoginRequiredMiddleware', 
]

middleware.py

import re
from django.conf import settings
from django.shortcuts import redirect

EXEMPT_URLS = [re.compile(settings.LOGIN_URL.lstrip('/'))]
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
    EXEMPT_URLS += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS]

class LoginRequiredMiddleware:
    pass
    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('/')
        print(path)
        
        if not request.user.is_authenticated:
            if not any(url.match(path) for url in EXEMPT_URLS):
                return redirect(settings.LOGIN_URL)
    

views.py

def login_user(request):
    if request.user.is_authenticated:
        return redirect('list-venues')
    if request.method == "POST":
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            next_param = request.POST.get('next')
            if next_param:    #<-- this is the bit that is not working anymore
                url= next_param
            else:
                url = reverse('list-venues')
            return redirect(url)
        else:
            messages.success(request,("There was an error, try again!"))
            return redirect('login_user')
    else:
        return render(request,'main/registration/login_user.html',{})

Вы можете поместить его в переменную сессии

В вашем промежуточном ПО

   request.session['next_param'] = path
   return redirect(settings.LOGIN_URL)

Затем на странице входа

        ... 
        if user is not None:
            login(request, user)
            #next_param = request.POST.get('next')
            url= request.session.get('next_param', reverse('list_venues'))
            return redirect(url)
Вернуться на верх