copser
copser

Reputation: 2641

PUT method makes Invalid password format or unknown hashing algorithm DRF

POST request for creating user is working fine, but when I preform PUT method on a user and change the password I'm getting Invalid password format or unknown hashing algorithm, so I'm a bit confused why is this happening, so can someone please help me overcome this.

MyUserSerializer

from rest_framework import serializers

from business_accounts.models.my_user import MyUser


class MyUserSerializer(serializers.ModelSerializer):
    """
    TODO: MyUser model Serializers
    :return: TODO
    """
    password = serializers.CharField(min_length=8, write_only=True)

    class Meta:
        model = MyUser
        fields = '__all__'

    def create(self, validated_data):
        user = super(MyUserSerializer, self).create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

User Detailed APIView

from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from ..serializers.my_user_serializers import MyUserSerializer
from business_accounts.models.my_user import MyUser


class UserDetailView(APIView):
    """
    User detail api view
    """
    def get_object(self, pk):
        try:
            return MyUser.objects.get(pk=pk)
        except MyUser.DoesNotExist:
            raise Http404

    def get(self, request, pk):
        user = self.get_object(pk)
        serializer = MyUserSerializer(user)
        return Response(serializer.data)

    def put(self, request, pk):
        user = self.get_object(pk)
        serializer = MyUserSerializer(user, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        user = self.get_object(pk)
        user.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

Upvotes: 1

Views: 639

Answers (2)

neverwalkaloner
neverwalkaloner

Reputation: 47364

You need to override serializer's update method also to correctly set password for PUT request:

class MyUserSerializer(serializers.ModelSerializer):
    """
    TODO: MyUser model Serializers
    :return: TODO
    """
    password = serializers.CharField(min_length=8, write_only=True)

    class Meta:
        model = MyUser
        fields = '__all__'

    def create(self, validated_data):
        user = super(MyUserSerializer, self).create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

    def update(self, instance, validated_data):
        password = validated_data.pop('password')
        user = super(MyUserSerializer, self).update(instance, validated_data)
        if password: 
            user.set_password(password)
        user.save()
        return user

Note set_password method is using for password hasing.

Upvotes: 1

Ivan Lavrenov
Ivan Lavrenov

Reputation: 76

You need to use hashing algorithm. check -> this

Upvotes: 2

Related Questions