В проекте Django метод authenticate возвращает None
У меня проблема с методом authenticate(). Он всегда возвращает None. Я проверил все аргументы и они не пустые. В модели у меня USERNAME_FIELD = 'username', в настройках у меня AUTH_USER_MODEL = 'account.User'. Я действительно не могу понять, почему это не работает. Помогите пожалуйста
models.py
class UserManager(BaseUserManager):
def _create(self, username, password):
if not username:
raise ValueError('Username cant be empty')
user = self.model(username=username)
user.set_password(raw_password=password)
user.save()
return user
def create_user(self, username, password):
return self._create(username=username, password=password)
class User(AbstractBaseUser):
id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='id')
email = models.EmailField()
username = models.CharField(max_length=25, unique=True)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
education = models.CharField(max_length=100, blank=True)
date_of_birth = models.DateField(blank=True, null=True)
name = models.CharField(max_length=25, blank=True)
last_name = models.CharField(max_length=25, blank=True)
objects = UserManager()
USERNAME_FIELD = 'username'
views.py
class UserLoginView(ObtainAuthToken):
serializer_class = UserLoginSerializer
serializers.py
class UserLoginSerializer(serializers.Serializer):
username = serializers.CharField(required=True)
password = serializers.CharField(required=True)
def validate_username(self, username):
if not User.objects.filter(username=username).exists():
raise serializers.ValidationError('User wasn\'t found')
print(User.objects.get(username=username).password)
return username
def validate(self, data):
# authentications
request = self.context.get('request')
username = data.get('username') # test_name
password = data.get('password') # newpassword11
if username and password:
user = authenticate(username=username, password=password, request=request)
print(user)
if not user:
raise serializers.ValidationError('Invalid password')
else:
raise serializers.ValidationError('You have to type you\'re mail and password')
data['user'] = user
return data
Я исправил это, изменив модель на следующую:
class User(AbstractBaseUser, PermissionsMixin):
.....
после отправки post запроса на url маршрутизация в UserLoginView
представление с username
и password
в теле поста получили Json что-то вроде этого в ответе:
{"token":"30e0215a5f4cc521203a633452d63995d8f1fa77"}
При использовании AbstractBaseUser
вместо AbstractUser
будьте внимательны, чтобы реализовать все требования пользовательской модели Django.
Советы: Не забудьте правильно выполнить настройки DRF Authentication
.
Проблема была в поле users
, называемом is_active
. Django позволяет login
только когда пользователь активен.
P.S. Спасибо всем, кто пытался помочь :)