Django登录认证成功后无法重定向至首页问题求助
问题分析与解决方案
核心问题:视图函数名与Django内置函数冲突
你的自定义login视图函数和Django自带auth模块中的login认证函数重名了。当你在代码里调用login(request, uauth)时,实际执行的是你自己写的这个登录视图,而非用于设置用户登录状态的内置认证函数。这会导致用户登录状态未被正确标记,home视图检测到用户未认证后又重定向回登录页,形成循环。
具体修复步骤
1. 修改自定义登录视图的函数名
将自定义的登录视图函数名改为user_login(或其他不与内置函数冲突的名称):
def home(request): print(request.user) if request.user.is_authenticated: return render(request, "home/home.html") else: # 建议使用URL名称重定向,路径变更时无需修改此处代码 return redirect("login") # 修改函数名,避免与内置login冲突 def user_login(request): error = '' if request.method == "POST": username = request.POST['username'] password = request.POST['password'] try: user = AppUser.objects.get(email=username) except AppUser.DoesNotExist: error = 'Usuario no encontrado' return render(request, 'login.html', {'error': error, 'form': Login()}) if hasattr(user, 'appuserauth'): if user.appuserauth.check_password(password): uauth = authenticate(request, username=user.email, password=password) if uauth is not None: # 明确导入并调用Django内置的login认证函数 from django.contrib.auth import login login(request, uauth) return redirect("home") else: error = 'Contraseña incorrecta' return render(request, 'login.html', {'error': error, 'form': Login()}) else: error = 'El usuario no tiene una contraseña' return render(request, 'login.html', {'error': error, 'form': Login()}) else: return render(request, "login.html", { "form": Login(), "error": error })
2. 同步更新URL配置
修改URL映射,指向新的视图函数,保持URL名称不变(前端表单无需修改):
from django.urls import path from . import views urlpatterns = [ path('home/', views.home, name='home'), path('inventario/', views.inventario, name='inventario'), path('compras/', views.compras, name='compras'), path('ventas/', views.ventas, name='ventas'), # 关联到新的视图函数user_login path('login/', views.user_login, name='login'), ]
3. 优化重定向写法
将home视图中的redirect("login/")改为redirect("login"),使用URL名称而非硬编码路径,提升代码可维护性。
额外检查项
- 确保已在视图文件顶部正确导入
from django.contrib.auth import authenticate - 确认
AppUser与AppUserAuth的关联逻辑正确,保证authenticate能正常返回合法的用户对象
内容的提问来源于stack exchange,提问作者Antony Arévalo
相关产品推荐
相关产品推荐

