LoginRequiredMiddleware - перенаправление на предыдущую страницу после пути allauth не работает
Я реализовал LoginRequiredMiddleware так, что когда пользователь подключается к любой странице приложения, он перенаправляется на login_page. После входа или подписи они перенаправляются на страницу, на которой они ранее находились.
Для этого я использую переменную path (код в конце), которая затем используется в представлениях входа и регистрации.
Это прекрасно работает для классического входа и регистрации.
Однако я также внедрил allauth, и когда пользователь регистрируется, скажем, в Google, перенаправление на предыдущую страницу не происходит, и пользователь перенаправляется на LOGIN_REDIRECT_URL.
Это потому, что я не создал специальное представление для регистрации в google.
Полагаю, что есть 2 варианта:
- Создайте представление google sign up и используйте переменную path - я не уверен, как это сделать (самая большая проблема);
- Есть более простой способ обойти эту проблему.
middleware.py
import re
from django.conf import settings
from django.shortcuts import redirect
from django.contrib.auth.views import redirect_to_login
from django.urls import reverse
..
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):
request.session['next_param'] = path
return redirect(settings.LOGIN_URL)
просмотров (пример подписки: path определяется request.session['next_param'], который используется в редиректе url )
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)
url= request.session.get('next_param', reverse('list-venues')) #<-- redirection is happening here.
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',{})
шаблон
<form method="POST" class="" action="">
<input type="hidden" name="next" value="{{ request.GET.next }}" />
{% csrf_token%}
<div class="form-group">
<input type="text" class= "form-control" name="username" placeholder="Enter User Name">
</div>
<div class="form-group">
<input type="password" class= "form-control" name="password" placeholder="Password">
</div>
<div class="col-md-12 text-center ">
<button class="button1 btn-block mybtn tx-tfm" type="submit" >Login</button>
<div class="col-md-12 text-center ">
<a class="button2 btn-block mybtn tx-tfm" type="submit" href="{% provider_login_url 'google' %}" >Login with Google</a>
</div>
</form>
Когда я печатаю путь на консоли, происходит следующее: (он должен перенаправлять на list_event/, но перенаправляет на list_venues/
November 29, 2022 - 13:51:09
Django version 4.0.6, using settings 'mysite.settings.dev'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
list_event/
[29/Nov/2022 13:51:19] "GET /list_event/ HTTP/1.1" 302 0
login_user
[29/Nov/2022 13:51:19] "GET /login_user HTTP/1.1" 200 5357
[29/Nov/2022 13:51:19] "GET /..
accounts/google/login/
[29/Nov/2022 13:51:23] "GET /accounts/google/login/ HTTP/1.1" 302 0
accounts/google/login/callback/
[29/Nov/2022 13:51:27] "GET /accounts/google/login/callback/?[....]HTTP/1.1" 302 0
list_venues/