Перенаправление в Django дает ответ 302

Я пытаюсь предотвратить доступ аутентифицированного пользователя к странице регистрации. Вот что я написал.

def validate_request(request):
    if request.user.is_authenticated and request.user.is_active:
        print("Condition approved")
        return redirect("home:home")

def signup_view(request):
    validate_request(request)
    if request.method == "POST":
        form = StudentUserSignupForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect("https://google.com"). #TODO: Replace it
        else:
            redirect("home:home")
    else:
        print("Got some other method: ", request.method)
        form = StudentUserSignupForm()
    context = {
        "form": form,
    }
    return render(request, "signup_login_form.html", context=context)

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

Я добавил несколько быстрых операторов печати при вызове функции перенаправления внутри функции validate_request, и вывод был

<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/">

URL, который он пытался проверить, уже присутствует и является правильным.

Я заменил перенаправление на https://google.com вместо home:home и он все равно дал тот же ответ.

Третья попытка заключалась в перенаправлении сразу после вызова функции signup_view. Это тоже не сработало с тем же ответом как при внутреннем перенаправлении, так и при перенаправлении на Google.

Я застрял на этой проблеме в течение некоторого времени. Я просмотрел ответы на похожие вопросы, но они мне не помогли.

Некоторые подробности, которые могут быть полезны

Структура проекта является

Website
|
'->Website
   '->urls.py
   '-> ...
   '-> ...
'->Users
   '-> urls.py
'->Home
   '-> urls.py

Содержание Website/urls.py является

urlpatterns = [
    path('mdeditor/', include('mdeditor.urls')),
    path('admin/', admin.site.urls),
    path('', include("Home.urls")),
    path('u/', include('Users.urls')),
]

urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Содержание Users/urls.py является

app_name = "students"

urlpatterns = [
    path('signup/', signup_view, name="signup"),
    path('login/', login_view, name="login"),
]

Содержание home/urls.py является

app_name = "home"

urlpatterns = [
    path('', home_view, name="home")
]

Python==3.8.2 Django==3.2.6

Я не знаю, что я здесь упустил. Было бы очень полезно, если бы вы, ребята, указали мне на мою ошибку здесь.

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

from django.shortcuts import redirect
from functools import wraps
from django.urls import reverse

def redirect_logged_in_users(func):
    @wraps(func)
    def wrapper(request,*args,**kwargs):
        if request.user.is_authenticated and request.user.is_active:
            return redirect(reverse("home:home"))
        return func(request, *args, **kwargs)
    return wrapper

Тогда вы можете использовать этот пользовательский декоратор в представлении sign_up

@redirect_logged_in_users
def sign_up(request):
    # function code

Похоже, вы просто забыли использовать ответ validate_request:

def signup_view(request):
    response = validate_request(request)
    if response:
        return response
    ...

Если есть объект ответа (ваш редирект), просто верните его. В противном случае переходите к остальной части представления.

Вернуться на верх