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

输入正确登录凭证后仍被重定向至登录页面,求技术排查方案

Django登录后重定向异常问题排查

问题现象

输入正确的登录凭证后,系统未跳转到index页面,反而持续重定向回登录页面。终端输出显示登录逻辑已执行完成,但随后又进入登录视图的GET请求流程。

相关代码及终端输出

登录视图代码

def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST or None)
        if form.is_valid():
            email = form.cleaned_data.get('email')
            password = form.cleaned_data.get('password')
            user = authenticate(request, username=email, password=password)
            print('user:', user)
            print(password)
            if user is not None:
                login(request, user)
                print('1')
                return redirect('app:index')
            else:
                print('2')
                return JsonResponse({'success': False, 'message': 'Invalid email or password.'})
    else:
        form = LoginForm()
    print('3')
    return render(request, 'login.html', {'form': form})

终端输出

3
1
3

首页视图代码

def index(request):
    return render(request, 'index.html')

路由配置(urls.py)

# from django.conf.urls import url,include
from django.urls import include, path
from rest_framework import routers
from django.views.static import serve
from . import views
from .views import GenerateQRCodeView
from django.contrib.auth import views as auth_views

app_name = 'app'
router = routers.DefaultRouter()
urlpatterns = [

    path(r'^', include(router.urls)),
    path("", views.login_view, name="login_view"),
    path("login", views.login_view, name="login_view"),
    path("register", views.register, name="register"),
    path("index", views.index, name="index"),
    path("users", views.users, name="users"),
    path("log", views.log, name="log"),
    path("logout", views.userlogout, name="logout"),
    path('password_reset/', views.password_reset, name='password_reset'),
    path('password_reset/<uidb64>/<token>/', views.password_reset_confirm, name='password_reset_confirm'),
    path('qr_code/', GenerateQRCodeView.as_view(), name='generate-qr-code'),
    path('user_edit/', views.user_edit, name="user_edit")
    #path('sms/', SendSMS.as_view(), name='send_sms'),
]

排查分析

从终端输出3 -> 1 -> 3的流程可以看出:

  1. 首次访问登录页触发GET请求,打印3
  2. 提交POST请求后,登录验证通过,执行login(request, user)并打印1,随后返回redirect('app:index')
  3. 但紧接着又触发了登录视图的GET请求(再次打印3),说明index页面跳转后又被重定向回了登录页

可能的根因:

  1. 路由配置错误:path(r'^', include(router.urls))写法不规范,path不支持正则表达式,应使用re_path处理正则匹配,虽不直接导致问题,但可能引发路由匹配异常
  2. Session/Cookie失效:login(request, user)执行后,用户Session未被正确保存,导致访问index时系统判定用户未登录,触发重定向
  3. 全局登录验证拦截:项目中存在全局中间件(如自定义权限中间件)强制未登录用户跳转登录页,但登录后的用户状态未被正确识别
  4. 用户状态异常:虽然authenticate返回了用户对象,但需确认user.is_active是否为True(authenticate默认过滤非活跃用户,此可能性较低)

解决方案建议

  1. 修正路由正则写法:将path(r'^', include(router.urls))替换为re_path(r'^', include(router.urls)),确保正则路由匹配正常
  2. 验证Session有效性:在登录视图的login(request, user)后添加print(request.session.session_key),查看是否生成有效SessionKey;同时在index视图中添加print(request.user.is_authenticated),确认用户登录状态是否被正确识别
  3. 检查全局中间件:查看settings.py中的MIDDLEWARE配置,确认是否存在强制登录的中间件,若有需验证其逻辑是否正确处理已登录用户
  4. 添加登录保护装饰器:给index视图添加@login_required装饰器,同时确保settings.py中LOGIN_URL配置为'app:login_view',明确登录跳转规则
  5. 清除浏览器缓存/Cookie:测试时清除浏览器缓存和Cookie,避免旧的无效Session干扰

内容的提问来源于stack exchange,提问作者J R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:22:57