Пароль не шифруется при регистрации пользователя в Django

#python #django

#python #django

Вопрос:

serializers.py

 class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email')

class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'password')
        extra_kwargs = {'password': {'write_only': True}}

        def create(self, validated_data):
            user = User(validated_data['username'], validated_data['email'])
            user.set_password(validated_data['password'])
            user.save()
            return user
  

views.py

 class RegisterAPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        print("user = ",user)
        return Response({
            "user": UserSerializer(user, context=self.get_serializer_context()).data,
            "token": AuthToken.objects.create(user)[1]
            })

# Create your views here.

class LoginAPI(KnoxLoginView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request, format=None):
        serializer = AuthTokenSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        login(request, user)
        return super(LoginAPI, self).post(request, format=None)

# Get User API
class UserAPI(generics.RetrieveAPIView):
    permission_classes = [permissions.IsAuthenticated,]
    serializer_class = UserSerializer

    def get_object(self):
        return self.request.user
  

Пароль не шифруется в указанном формате, и, следовательно, API входа также не работает. Он показывает —
«non_field_errors»: [
«Невозможно войти в систему с предоставленными учетными данными».
]
Кроме того, в панели администратора django отображается этот недопустимый формат пароля

Комментарии:

1. используете ли вы AbstractBaseUser

2. Я думаю, что нет, где это найти?

3. откуда вы получаете этого пользователя модели

4. from django.contrib.auth.models import User Я использовал это

Ответ №1:

Обновите метод создания класса «RegisterSerializer».

 def create(self, validated_data):
        user = User(validated_data['username'], validated_data['email'])
        user.password = make_password(validated_data['password'])
        user.save()
        return user
  

И не забудьте импортировать метод make_password.

 from django.contrib.auth.hashers import make_password
  

И вы создаете метод с неправильным отступом.

Serializer.py

 class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email')

class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'password')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = User(validated_data['username'], validated_data['email'])
        user.set_password(validated_data['password'])
        user.save()
        return user
  

Комментарии:

1. Я попробовал ваше решение, но та же ошибка все еще существует

2.Попробуйте: user = User.objects.create_user( password=validated_data['password'], username=validated_data['username'], email=validated_data['email']) return user

3. Вы проверили отступ в методе «создать» класса «RegisterSerializer»? Я думаю, что метод «create» не имеет правильного отступа.

4. Но в вашем вопросе serializer.py файл имеет неправильный отступ. Я обновил свой ответ, вы можете проверить его снова.

5. Большое спасибо. Теперь пароль зашифровывается. Я думал, что метод create находится внутри мета-класса.