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

Django创建用户后无法登录,authenticate返回None问题求助

Django注册后无法登录的问题排查与修复

核心原因:默认认证后端不支持邮箱登录

Django默认的authenticate()方法仅通过username字段匹配用户,你当前登录视图中用email=email作为查询条件,默认后端无法识别,导致始终返回None,登录失败。

快速修复方案(无需配置后端)

修改登录视图,先通过邮箱找到用户再验证密码:

def signin(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        pass1 = request.POST.get('password1')
        
        # 通过邮箱查找用户
        try:
            user = User.objects.get(email=email)
        except User.DoesNotExist:
            messages.error(request, '无效的邮箱或密码')
            return render(request, 'signin.html')
        
        # 验证密码正确性
        if user.check_password(pass1):
            login(request, user)
            fname = user.first_name
            return render(request, 'store.html', {'fname':fname})
        else:
            messages.error(request, '无效的邮箱或密码')
            return render(request, 'signin.html')
    return render(request, 'signin.html')

优雅方案:配置邮箱登录后端

在项目settings.py中添加自定义认证后端:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'your_app_name.backends.EmailBackend',  # 替换为你的应用名
]

在应用目录下创建backends.py,编写自定义后端逻辑:

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

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(email=username)
        except User.DoesNotExist:
            return None
        return user if user.check_password(password) else None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

之后登录视图可直接使用authenticate(username=email, password=pass1)。


注册流程的必修复漏洞

  1. 未验证两次密码一致性
    注册视图中获取了pass2但未校验,用户输入两次密码不同仍会创建账号,导致登录时密码不匹配。修改代码:

    def signup(request):
        if request.method == 'POST':
            username = request.POST['username']
            email = request.POST['email']
            fname = request.POST['fname']
            lname = request.POST['lname']
            pass1 = request.POST['password1']
            pass2 = request.POST['password2']
    
            # 校验两次密码一致
            if pass1 != pass2:
                messages.error(request, '两次输入的密码不一致')
                return redirect('signup')
            
            # 校验用户名/邮箱是否已存在
            if User.objects.filter(username=username).exists():
                messages.error(request, '用户名已被使用')
                return redirect('signup')
            if User.objects.filter(email=email).exists():
                messages.error(request, '邮箱已被注册')
                return redirect('signup')
    
            myuser = User.objects.create_user(username, email, pass1)
            myuser.first_name = fname 
            myuser.last_name = lname
            myuser.save()
            messages.success(request, '注册成功,请登录')
            return redirect('signin')
        return render(request, 'signup.html')
    
  2. 注册页面ID重复问题
    注册页中"Last name"输入框的id="email"与邮箱输入框ID重复,会导致表单数据异常。修改为:

    <div class="mb-3">
        <label for="" class="form-label">Last name </label>
        <input type="text" class="form-control" id="lname" name="lname" placeholder="Last name" required>
    </div>
    

登录页面优化建议

将邮箱输入框的type="text"改为type="email",让浏览器自动做格式校验:

<input type="email" class="form-control" id="email" aria-describedby="emailHelp" name="email" placeholder="Enter Email " required>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:42:50