代码之家  ›  专栏  ›  技术社区  ›  copser

Put方法生成无效的密码格式或未知的哈希算法DRF

  •  0
  • copser  · 技术社区  · 7 年前

    创建用户的post请求可以正常工作,但是当我对用户执行put方法并更改所获得的密码时 Invalid password format or unknown hashing algorithm ,所以我有点困惑,为什么会发生这种情况,有人能帮我克服这个问题吗?

    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
    

    用户详细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)
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   neverwalkaloner    7 年前

    您需要重写序列化程序的 update 方法还可以正确设置PUT请求的密码:

    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
    

    注释 set_password 方法正在用于密码哈希。

        2
  •  2
  •   Ivan Lavrenov    7 年前

    你需要使用散列算法。 检查& GT; this