0leg
0leg

Reputation: 14134

Django REST :: AssertionError: Invalid image format

I have View like this:

class LogoView(APIView):
    permission_classes = [UserWriteSafeReadPermission]

    def get_object(self):
        return Config.objects.get(domain=self.request.domain)

    ...

    def put(self, request, pk=None, format=None, **kwargs):
        config = self.get_object()

        try:
            image = request.FILES['image']
            config.set_logo(image)
            return Response(status=status.HTTP_201_CREATED)
        except KeyError:
            return Response(status=status.HTTP_400_BAD_REQUEST, data={'detail': 'Expected image.'})

A model:

def set_logo(self, image_data):
    ....
    try:
        image = Image.open(image_data) # <-- fails

And a unittest:

def test_foo(self):
        self.authenticate(USER_PERMISSION_WRITE)

        from PIL import Image
        import tempfile

        image = Image.new('RGB', (100, 100))
        tmp_file = tempfile.NamedTemporaryFile(suffix='.png')
        image.save(tmp_file)

        response = self.client.put(self.api_reverse('my_url'), {'image': tmp_file}, format='multipart')

And getting:

AssertionError: Invalid image format

EDIT: When I debug image = Image.open(image_data), I see that:

(Pdb) image_data.file.read()
''

Upvotes: 0

Views: 162

Answers (1)

Ivan Semochkin
Ivan Semochkin

Reputation: 8897

Here is how I create images for testing purposes, I found this solution in the SO, maybe it helps you.

from StringIO import StringIO
from PIL import Image

.....
def create_image_file(self):
    image_file = StringIO()
    image = Image.new('RGBA', size=(50, 50), color=(256, 0, 0))
    image.save(image_file, 'png')
    image_file.seek(0)
    return ContentFile(image_file.read(), 'test.png')

Upvotes: 1

Related Questions