今天在根据网上教程学习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
如有错误欢迎指正。