Django框架手动实现基础登录异常:不存在用户也提示已登录
问题原因
1. 核心逻辑错误
你的登录视图login_view存在明显的跳转逻辑问题:无论authenticate认证是否通过(即无论用户输入的账号密码是否合法),你都直接重定向到了成功页。
if user is not None: login(request, user) return redirect('/users/success/') else: # 认证失败分支没有任何错误处理,直接跳转成功页 return redirect('/users/success/')
如果你之前已经在当前浏览器登录过合法账号且未主动退出,request.user会一直保留之前的登录状态,访问成功页自然会返回「已登录」的提示。
2. 版本兼容问题(可选排查)
如果你确认从未登录过任何账号,依然出现该提示,检查你的Django版本:
- Django 1.9及更早版本中
is_authenticated是方法,必须加括号调用request.user.is_authenticated(),直接访问属性会恒返回True - Django 1.10+版本中
is_authenticated是属性,匿名用户访问该属性返回False
修复方案
- 修改登录视图的认证失败分支,不要直接跳转成功页,将错误信息返回给登录页:
def login_view(request): if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('/users/success/') else: form.add_error(None, "用户名或密码错误") return render(request, 'testauth/login.html', {'form': form}) else: form = LoginForm() return render(request, 'testauth/login.html', {'form': form})
- 测试前先退出当前已登录的账号,或者用浏览器无痕模式测试,避免之前的登录状态干扰结果。
- 如果你使用的是1.9及更早版本的Django,将
success_view中的判断改为if request.user.is_authenticated():
内容的提问来源于stack exchange,提问作者eitan
相关产品推荐
相关产品推荐

