Django 3.2项目中login_required装饰器失效问题如何解决?
问题修复方案
你遇到的login_required失效问题核心是路由路径配置错误,附带部分视图逻辑疏漏,按以下步骤修改即可:
- 修正
login_required装饰器的跳转路径
当前你所有@login_required(login_url='login/')使用的是相对路径,当用户访问非根路径的受保护路由(比如/delete_todo/1/)时,跳转路径会被错误拼接为/delete_todo/1/login/,无法匹配到正确的登录路由。
推荐使用更规范的命名路由写法,首先在views.py顶部导入反向解析工具:
再把所有from django.urls import reverse_lazy@login_required(login_url='login/')修改为:
也可以直接写绝对路径@login_required(login_url=reverse_lazy('todo:login'))login_url='/login/'临时修复。 - 修正登录、注销视图的跳转逻辑
logoutUser视图中的redirect('login/')同样是相对路径,修改为redirect('todo:login')或者redirect('/login/')。- 补充
login_user视图的认证失败提示,避免用户误以为登录成功实际仍是未登录状态,修改后的登录视图逻辑如下:
def login_user(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('/') else: messages.error(request, '用户名或密码错误') return render(request, 'html/login.html') - 简化配置(可选)
直接在项目的settings.py中添加全局配置:
之后所有LOGIN_URL = '/login/'login_required装饰器无需单独配置login_url参数,直接写@login_required即可,避免重复写错路径。 - 排查缓存问题
如果项目配置了全局页面缓存或视图缓存,也可能导致未登录用户能访问到受保护页面,可以临时注释缓存配置验证问题是否解决。 - 调试验证
可以在home视图中临时添加调试代码print(request.user.is_authenticated),重启服务器后多次访问,通过控制台输出确认用户登录态是否符合预期。
内容的提问来源于stack exchange,提问作者Zani123
相关产品推荐
相关产品推荐

