Перенаправление на предыдущую страницу после входа в систему с помощью 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)