我目前正在实现一个Django应用程序的认证,我正在编写。按照Thinkster Django课程的代码,我实现了整个注册流程,但我无法登录,因为在注册用户时密码没有被哈希。
这是我的自定义用户模型和create_user
函数。
class UserManager(BaseUserManager)
def create_user(self, username, email, password=None):
if username is None:
raise TypeError('Users must have a username.')
if email is None:
raise TypeError('Users must have an email address.')
user = self.model(username=username, email=self.normalize_email(email))
user.set_password(password)
user.save()
return user
def create_superuse(self, username, email, password):
if password is None:
raise TypeError('Superusers must have a password.')
user = self.create_user(username, email, password)
user.is_superuser = True
user.is_staff = True
user.save()
return user
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(db_index=True, max_length=255, unique=True)
email = models.EmailField(db_index=True, unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = UserManager()
如您所见,我明确调用了“set_password”函数,但我无法找出为什么它不能得到正确执行?
我的序列化器(Serializer)如下所示,其中我创建了用户:
class RegistrationSerializer(serializers.ModelSerializer):
password = serializers.CharField(
max_length=128,
min_length=8,
write_only=True
)
token = serializers.CharField(max_length=255, read_only=True)
class Meta:
model = User
fields = ['email', 'username', 'password', 'token']
def create(self, validated_data):
return User.objects.create_user(**validated_data)
请注意,与
return User.objects.create_user(**validated_data)
不同的是,我还尝试使用return get_user_model().objects.create_user(**validated_data)
,因为这是另一个问题中的建议,但那也没有起作用。我也发布了我的视图,以防有什么问题,但我真的不认为那是问题所在。
class RegistrationAPIView(APIView):
permission_classes = (AllowAny,)
renderer_classes = (UserJSONRenderer,)
serializer_class = RegistrationSerializer
def post(self, request):
user = request.data.get('user', {})
serializer = self.serializer_class(data=user)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
旁注: 如果相关的话,我使用Postman
发送请求并且所有返回的响应看起来都是正确的。但是当我浏览我的SQLite时,我发现密码没有被散列。这也导致用户无法登录,因为在登录过程中,密码会被散列然后与数据库中的密码进行比较。
旁注2: 当我通过命令行使用python manage.py createsuperuser
注册用户时,它会得到一个散列密码,一切都按照我的正常预期运行。
PASSWORD_HASHERS
和make_password
方法??https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-PASSWORD_HASHERShttps://docs.djangoproject.com/en/1.8/topics/auth/passwords/#django.contrib.auth.hashers.make_password - SurajanoPASSWORD_HASHERS
列表,但是我应该在哪里编写我的make_password
函数呢? - Lysandros Nikolaoucreate_user
函数是否在UserManager
类中声明的?:) - neverwalkaloner