LoginRequiredMiddleware - перенаправление на предыдущую страницу после пути allauth не работает

Я реализовал LoginRequiredMiddleware так, что когда пользователь подключается к любой странице приложения, он перенаправляется на login_page. После входа или подписи они перенаправляются на страницу, на которой они ранее находились.

Для этого я использую переменную path (код в конце), которая затем используется в представлениях входа и регистрации.

Это прекрасно работает для классического входа и регистрации.

Однако я также внедрил allauth, и когда пользователь регистрируется, скажем, в Google, перенаправление на предыдущую страницу не происходит, и пользователь перенаправляется на LOGIN_REDIRECT_URL.

Это потому, что я не создал специальное представление для регистрации в google.

Полагаю, что есть 2 варианта:

  1. Создайте представление google sign up и используйте переменную path - я не уверен, как это сделать (самая большая проблема);
  2. Есть более простой способ обойти эту проблему.

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/
Вернуться на верх