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
相关产品推荐
相关产品推荐

