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
相关产品推荐
相关产品推荐

