【问题标题】:Redirect in Django giving 302 response在 Django 中重定向给出 302 响应
【发布时间】:2021-10-20 19:14:47
【问题描述】:

我想要做的是阻止经过身份验证的用户访问注册页面。这是我写的。

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

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

【问题讨论】:

  • 在使用login函数之前必须先对用户进行身份验证
  • @AmandeepSingh 未经身份验证的用户应该能够访问注册页面。经过身份验证的用户不应该这样做。
  • @PranavaMohan 该功能是关于注册用户的。我已经覆盖了函数form.save(),它首先将学生标记为活动,并在登录用户之前在数据库中填写其他必要的详细信息。可能也应该在此处添加该功能。
  • 为什么不在模板中根据用户是否注册来渲染注册按钮呢?此外,登录用户看到注册按钮也不常见!
  • @SANGEETHSUBRAMONIAM singup 按钮未向已登录的用户显示。我已经在模板中处理了它。但是用户仍然可以通过 URL 直接访问表单,或者通过浏览器转到上一页。

标签: python django django-views


【解决方案1】:

你好像忘了用validate_request的回复:

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

如果有响应对象(您的重定向),只需返回它。否则转到视图的其余部分。

【讨论】:

  • 因为看起来您只需要在注册视图中使用它,这应该足够了。但是如果你在很多观点上都需要它,我建议你使用@Amandeep Singh 的回答
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 2014-11-10
    • 2019-09-02
    • 2016-06-21
    • 2018-09-28
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多