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

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/'临时修复。
  • 修正登录、注销视图的跳转逻辑
    1. logoutUser视图中的redirect('login/')同样是相对路径,修改为redirect('todo:login')或者redirect('/login/')。
    2. 补充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:15:03