Lys*_*aou 6 python django django-rest-framework
我目前正在为 Django 应用程序实现身份验证,我正在编写。按照 Thinkster Django 课程的代码,我实现了整个注册过程,但是我无法登录,因为在注册用户时密码没有被散列。
这是我的自定义 User 模型和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()
Run Code Online (Sandbox Code Playgroud)
如您所见,我显式调用了该set_password函数,但我找不到,为什么它没有正确执行?
My 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)
Run Code Online (Sandbox Code Playgroud)
请注意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)
Run Code Online (Sandbox Code Playgroud)
旁注:如果相关,我正在发送请求Postman并且我得到的所有响应似乎完全正确。但是当我浏览我的 SQLite 时,我发现密码没有经过哈希处理。这也会导致用户无法登录,因为在登录过程中,密码会被散列,然后与数据库中的密码进行比较。
旁注 2:当我通过命令行使用 注册用户时python manage.py createsuperuser,它会得到一个散列密码,一切都按我通常的预期工作。
您需要在序列化程序中使用像这样的 set_password 方法:
def create(self, validated_data):
user = User(email=validated_data['email'], username=validated_data['username'])
user.set_password(validated_data['password'])
user.save()
return user
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |