Django authenticate(username=name,password=password)返回None的可能原因

今天在根据网上教程学习django时由于并没有完全根据教程代码走遇到authenticate校验返回None找了好久总算找到原因。

1.对象需要使用model.objects.create_user()创建

密码由set_password()方法会生成哈希串,如果由model.objects.create()密码会是明文的。使用该校验方法自然为None.

2.model.is_active需要是True

否则后续版本django也会为None,解决办法在settings中加入

AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']

3.但是我返回None的原因并不是前面两个,贴下我的model

class UserManager(BaseUserManager):
    def create_user(self, username, email, password):
        return self._create_user(username, email, password)

    def _create_user(self, username, email, password):
        if not username:
            raise ValueError("需要用户名")
        if not email:
            raise ValueError("need email")
        if not password:
            raise ValueError("need password")

        user = self.model(username=username, email=email)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self,username,email,password):
        return self._create_user(username, email, password)


class User(AbstractBaseUser):

    username = models.CharField(max_length=10, verbose_name="用户名",unique=True)
    email = models.EmailField(verbose_name="邮箱", unique=True)
    is_active = models.BooleanField(default=True)

    # USERNAME_FIELD = 'email'
    # REQUIRED_FIELDS = ['username',]

    USERNAME_FIELD = 'username'

    REQUIRED_FIELDS = ['email',]

    def get_full_name(self):
        return self.username

    def get_short_name(self):
        return self.username

    objects = UserManager()

    class Meta:
        verbose_name = "用户"
        verbose_name_plural = verbose_name
        db_table = "x_user"

一开始我是USERNAME_FIELD = ‘email’,然后验证的时候用authenticate(username=name,password=password)一直为none,然后尝试了下authenticate(email=email,password=password)就可以拿到对象了。所以authenticate方法应该同时需要USERNAME_FIELD指定字段和password才可以正常使用
修改前:

>>> user=authenticate(email='wwaaa@qq.com',password='123123')
>>> print(user)
wwaaa@qq.com

修改后:

>>> user=authenticate(username='admin',password='123123')
>>> print(user)
admin
>>> user=authenticate(email='wwaaa@qq.com',password='123123')
>>> print(user)
None

最后:
authenticate需要model里的USERNAME_FIELD和password

如有错误欢迎指正。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值