首页 > 解决方案 > 在 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调用函数后立即重定向。内部重定向和重定向到谷歌的相同响应也失败了。

我一直在这个问题上停留了一段时间。我已经回答了类似问题,但这些似乎对我没有帮助。

更多可能有用的细节

项目结构是

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

我不知道我在这里错过了什么。如果你们能在这里指出我的错误,那将非常有帮助。

标签: pythondjangodjango-views

解决方案


我本可以在视图本身中检查经过身份验证的用户。但是最好编写一个可以在任何视图中使用的自定义装饰器。如果您想阻止登录用户访问任何视图,则可以使用以下命令。

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

推荐阅读