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

Django中@login_required无法识别已认证用户问题求助

Django中@login_required装饰器无法识别已认证用户的问题排查

我是一名Python新手开发者,正在开发一个简易语言学校管理应用。已实现登录页面,可与数据库中用户凭证匹配验证,终端打印‘Success’说明认证成功,但@login_required装饰器仍无法识别我已认证。

相关代码

views.py

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required


def login_view(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(request, username=username, password=password)
        print(user)
        if user is not None:
            login(request, user)
            print('Success')
            return redirect("dashboard")
        else:
            error_message = "Invalid login credentials"
            return render(request, "login.html", {"error_message": error_message})
    return render(request, "login.html")


def logout_view(request):
    logout(request)
    return redirect("login")


@login_required()
def dashboard(request):
    return render(request, "dashboard.html")

自定义认证后端

from django.contrib.auth.backends import ModelBackend
from .models import Teacher


class TeacherBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            teacher = Teacher.objects.get(username=username)
        except Teacher.DoesNotExist:
            return None

        if teacher.check_password(password):
            return teacher

        return None

可能的原因及解决方法

  • 自定义认证后端未在settings.py中注册
    Django默认只会使用内置的认证后端,你自定义的TeacherBackend必须添加到AUTHENTICATION_BACKENDS配置中,否则登录后的用户会话无法被后续的认证校验识别。在settings.py中添加:

    AUTHENTICATION_BACKENDS = [
        'your_app_name.TeacherBackend',  # 替换为你的app名称
        # 可选保留默认后端,兼容其他用户类型
        'django.contrib.auth.backends.ModelBackend',
    ]
    
  • 自定义用户模型未配置AUTH_USER_MODEL
    如果你的Teacher模型是作为自定义用户模型使用的(继承了AbstractUser或AbstractBaseUser),必须在settings.py中指定AUTH_USER_MODEL,否则Django会默认使用内置的User模型,导致会话中的Teacher对象不被认证系统认可:

    AUTH_USER_MODEL = 'your_app_name.Teacher'  # 替换为你的app名称
    

    注意:这个设置必须在项目初始化时就配置,否则后续需要迁移数据库,避免出现冲突。

  • 会话配置异常
    检查settings.py中的会话相关配置,确保:

    • SESSION_ENGINE设置为默认的'django.contrib.sessions.backends.db'(确保会话能存入数据库)
    • SESSION_COOKIE_SECURE如果设为True,需要在HTTPS环境下测试,本地开发可以暂时设为False
      同时可以尝试清除浏览器缓存和数据库中的sessions记录,重新登录测试。
  • 装饰器参数问题(次要)
    @login_required()可以省略括号直接写@login_required,如果指定了login_url参数,要确保路径正确,但你的情况中认证成功后能跳转dashboard,大概率不是这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:20:31