输入正确登录凭证后仍被重定向至登录页面,求技术排查方案
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的流程可以看出:
- 首次访问登录页触发GET请求,打印
3 - 提交POST请求后,登录验证通过,执行
login(request, user)并打印1,随后返回redirect('app:index') - 但紧接着又触发了登录视图的GET请求(再次打印
3),说明index页面跳转后又被重定向回了登录页
可能的根因:
- 路由配置错误:
path(r'^', include(router.urls))写法不规范,path不支持正则表达式,应使用re_path处理正则匹配,虽不直接导致问题,但可能引发路由匹配异常 - Session/Cookie失效:
login(request, user)执行后,用户Session未被正确保存,导致访问index时系统判定用户未登录,触发重定向 - 全局登录验证拦截:项目中存在全局中间件(如自定义权限中间件)强制未登录用户跳转登录页,但登录后的用户状态未被正确识别
- 用户状态异常:虽然
authenticate返回了用户对象,但需确认user.is_active是否为True(authenticate默认过滤非活跃用户,此可能性较低)
解决方案建议
- 修正路由正则写法:将
path(r'^', include(router.urls))替换为re_path(r'^', include(router.urls)),确保正则路由匹配正常 - 验证Session有效性:在登录视图的
login(request, user)后添加print(request.session.session_key),查看是否生成有效SessionKey;同时在index视图中添加print(request.user.is_authenticated),确认用户登录状态是否被正确识别 - 检查全局中间件:查看
settings.py中的MIDDLEWARE配置,确认是否存在强制登录的中间件,若有需验证其逻辑是否正确处理已登录用户 - 添加登录保护装饰器:给
index视图添加@login_required装饰器,同时确保settings.py中LOGIN_URL配置为'app:login_view',明确登录跳转规则 - 清除浏览器缓存/Cookie:测试时清除浏览器缓存和Cookie,避免旧的无效Session干扰
内容的提问来源于stack exchange,提问作者J R
相关产品推荐
相关产品推荐

