Перенаправление в 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
...
Если есть объект ответа (ваш редирект), просто верните его. В противном случае переходите к остальной части представления.