Django登录功能异常:为何重定向至不存在的/accounts/login/login路径?
问题排查与解决方案
核心问题分析
你遇到的/accounts/login/login路径错误,结合代码来看有两个关键问题:
视图逻辑判断错误
原代码里用if username is not None:判断认证结果,这完全逻辑颠倒——只要用户输入了用户名(哪怕密码错误),都会执行登录逻辑,而当user为None(认证失败)时反而跳转到注册页。更严重的是,若user为None时执行auth.login(request, user)会直接抛出异常,可能触发后续的错误跳转。表单提交路径使用相对路径
你的登录模板中表单action大概率用了相对路径(比如action="login/"),当当前页面是/accounts/login/时,浏览器会把相对路径拼接到当前路径后,最终变成/accounts/login/login/。
修复步骤
1. 修正登录视图函数
把判断条件改为检查user对象,同时认证失败时直接返回登录页面并携带错误提示,避免不必要的重定向:
def logIn(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = auth.authenticate(username=username, password=password) if user is not None: # 正确判断认证后的user对象 auth.login(request, user) return redirect('/') else: # 认证失败,返回登录页并传递错误信息 return render(request, 'logIn.html', {'error_msg': '用户名或密码不匹配'}) else: return render(request, 'logIn.html')
2. 给URL路由命名并修正表单action
首先在Accounts/urls.py中给登录路由添加名称,方便Django反向解析URL:
from django.urls import path from . import views urlpatterns = [ path('', views.Empty), path('register/', views.register, name='register'), path('login/', views.logIn, name='login') # 添加name属性 ]
然后修改登录模板logIn.html中的表单,使用Django的URL反向解析生成绝对路径,彻底解决相对路径问题:
<form method="post" action="{% url 'login' %}"> {% csrf_token %} <input type="text" name="username" placeholder="用户名" required> <input type="password" name="password" placeholder="密码" required> <!-- 显示错误信息 --> {% if error_msg %} <p style="color: #dc3545;">{{ error_msg }}</p> {% endif %} <button type="submit">登录</button> </form>
额外建议
- 避免直接写硬编码的URL(比如
redirect('/accounts/register/')),尽量使用redirect('register')这种基于路由名称的跳转,后续修改URL结构时无需改动视图代码。 - 首次开发Django项目可以多参考官方用户认证文档,官方提供了更简洁的认证视图(比如
LoginView类视图),能减少重复造轮子的错误。
内容的提问来源于stack exchange,提问作者user20827834
相关产品推荐
相关产品推荐

