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

Django+PostgreSQL登录认证功能异常问题求助

Django登录认证失效问题解决方案

核心问题分析

  • Django的authenticate()函数默认仅识别自带的django.contrib.auth.models.User模型,你自定义的UsersPass模型不在认证系统的识别范围内,因此无论输入是否正确都会返回None。
  • 你的UsersPass模型中密码以明文存储,而Django认证系统要求密码必须经过哈希加密,明文密码无法通过验证逻辑。

解决方案一:使用Django自带User模型(快速修复)

1. 替换自定义模型

删除UsersPass模型,直接使用Django内置的User模型。如果需要扩展用户字段,可通过OneToOneField关联自定义扩展模型。

2. 正确创建用户(生成哈希密码)

禁止手动在数据库插入明文密码,使用Django提供的方法创建用户:

# 命令行创建普通用户或超级用户
python manage.py createsuperuser
# 或代码中创建
from django.contrib.auth.models import User
user = User.objects.create_user(username='你的用户名', password='你的密码')
user.save()

3. 保留原登录视图

原views.py中的user_login函数无需修改,authenticate()会自动适配内置User模型完成验证。

解决方案二:自定义认证模型(适合需扩展用户字段场景)

如果必须使用自定义用户模型,需让模型继承认证基类并配置系统识别:

1. 修改models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin

# 自定义用户管理器,负责生成哈希密码
class UserManager(BaseUserManager):
    def create_user(self, username, password=None, **extra_fields):
        if not username:
            raise ValueError('用户名不能为空')
        user = self.model(username=username, **extra_fields)
        user.set_password(password)  # 自动哈希加密密码
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(username, password, **extra_fields)

# 自定义用户模型,继承认证基类
class UsersPass(AbstractBaseUser, PermissionsMixin):
    id_user = models.IntegerField(primary_key=True)
    username = models.CharField(max_length=50, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'username'  # 指定登录标识字段

    def __str__(self):
        return self.username

2. 配置settings.py

添加一行指定自定义用户模型:

AUTH_USER_MODEL = 'Application.UsersPass'  # 格式:应用名.模型名

3. 重新迁移数据库

python manage.py makemigrations
python manage.py migrate

4. 创建自定义用户

from Application.models import UsersPass
user = UsersPass.objects.create_user(username='test', password='123456')
user.save()

5. 保留原登录视图

authenticate()会自动适配自定义模型完成验证,无需修改登录代码。

额外注意事项

  • 永远不要手动存储明文密码,必须通过set_password()方法生成哈希值。
  • 若已存在旧数据库表,修改用户模型后需重新迁移,开发环境可清空数据库后重新初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:47:06