Django休息更改用户密码视图

use*_*042 7 python django rest django-rest-framework

我正在使用Django Rest创建一个简单的API.我需要创建一个用户可以更改他/她的密码的视图.我使用默认的Django用户模型和一个简单的UserSerializer.有方法被调用,set_password但我无法找到一种方法与用户seriliazer正确使用它.我无法在任何地方找到任何解决方案.

UserSelializer:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', "username", 'email', 'first_name', 'last_name', 'password')
Run Code Online (Sandbox Code Playgroud)

View(ClassedBased):这是一个例子(我不知道我在这做什么):

    class UserChangePassword(APIView):

        def patch(self, request):
            user = self.request.user
            serialized = UserSerializer(data=request.DATA)
            if serialized.is_valid():
                user.set_password(serialized.data['password'])
                user.save()
                return Response(status=status.HTTP_205_RESET_CONTENT)
            else:
            return Response(serialized.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

请注意,我想发布一个json脚本来更改为密码.像这样的东西:

 {
    "old_password": "123", 
    "new_password": "12345"
}
Run Code Online (Sandbox Code Playgroud)

jni*_*ama 1

一种方法是重写序列化器中的restore_object方法。这看起来像这样:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', "username", 'email', 'first_name', 'last_name', 'password')

    # turn text to hashed password
    def restore_object(self, attrs, instance=None):
        attrs['password'] = make_password(attrs['password'])
        return super(UserSerializer, self).restore_object(attrs, instance=None)
Run Code Online (Sandbox Code Playgroud)

现在,当它反序列化为对象实例时,您将拥有一个有效的散列密码。然后,您应该能够通过稍微修改当前的视图来完成您想要的事情。

   class UserChangePassword(APIView):

       def patch(self, request):
           serialized = UserSerializer(data=request.DATA)
           if serialized.is_valid():
               serialized.save()
               return Response(status=status.HTTP_205_RESET_CONTENT)
           else:
               return Response(serialized.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

我相信 PATCH 请求中的 JSON(取决于查找类型,我认为默认为 id)看起来像这样:

{
  "id": "83",
  "password": "12345"
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!


编辑:

请注意,正如评论中指出的那样,Symmetricrestore_object在 DRF 3.0 中已被弃用