You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django redirect返回302但跳转失效,已认证用户仍可访问注册页

问题原因

你遇到的问题完全是因为没有返回视图函数生成的重定向对象,Django要求所有视图必须返回 HttpResponse 类的实例,你生成了redirect对象但没有return,代码会继续向下执行,最终返回的还是渲染后的注册页,所以跳转不生效。

存在两处同类错误:

  • 调用validate_request(request)后没有接收返回值、也没有返回该重定向对象
  • POST请求下表单验证失败分支的redirect("home:home")也没有加return

修复代码

方案1:直接修改调用逻辑

def validate_request(request):
    if request.user.is_authenticated and request.user.is_active:
        print("Condition approved")
        return redirect("home:home")
    # 未满足条件时返回None
    return None

def signup_view(request):
    # 检查是否需要重定向,有返回值直接返回给前端
    redirect_resp = validate_request(request)
    if redirect_resp:
        return redirect_resp
    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:
            # 这里必须加return
            return 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)

方案2:改用装饰器(更符合Django最佳实践)

你也可以直接把校验逻辑改成装饰器,避免每次调用都要手动处理返回值:

from functools import wraps

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

# 直接给视图加装饰器即可
@redirect_authenticated
def signup_view(request):
    # 剩下的原有逻辑不变,注意给表单验证失败的分支加return
    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:
            return 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)

内容的提问来源于stack exchange,提问作者Japkeerat Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:45:04