Django - Напишите тест для загрузки нескольких изображений

Ниже приведен код, который генерирует поддельное изображение и пытается отправить его на эту конечную точку. У меня есть точка останова в первой строке def post(self, request), и когда я смотрю в request.data, я не вижу ключа images, а когда я делаю request.FILES, это пустой мультидикт. Я пытаюсь позволить пользователю загружать несколько изображений, поэтому они находятся в списке. Как мне правильно добавить изображения в запрос для тестирования загрузки?

test.py

from django.core.files.base import ContentFile
from PIL import Image
from six import BytesIO


def create_image(storage, filename, size=(100, 100), image_mode='RGB', image_format='PNG'):
   """
   Generate a test image, returning the filename that it was saved as.

   If ``storage`` is ``None``, the BytesIO containing the image data
   will be passed instead.
   """
   data = BytesIO()
   Image.new(image_mode, size).save(data, image_format)
   data.seek(0)
   if not storage:
       return data
   image_file = ContentFile(data.read())
   return storage.save(filename, image_file

def test_image_upload_authorized(self):
    image = create_image(None, 'test.png')
    image_file = SimpleUploadedFile('test.png', image.getvalue())
    response = self.client.post(reverse('post'),
                                data={'creator_id': str(self.user.uuid),
                                      'images': [image_file]},
                                content_type='application/json')
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)

view.py

def post(self, request):
    serializer = PostSerializer(data=request.data)

    if serializer.is_valid():
        try:
            serializer.save()
        except django.db.utils.InternalError as e:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Мне удалось придумать следующее решение. Пожалуйста, скажите мне, является ли это "правильным способом" сделать это

test.py

def test_image_upload_authorized(self):
    image = create_image(None, 'test.png')
    image_file = SimpleUploadedFile('test.png', image.getvalue())
    image2 = create_image(None, 'test2.png')
    image_file2 = SimpleUploadedFile('test2.png', image.getvalue())
    response = self.client.post(reverse('post'),
                                data={'creator_id': str(self.user.uuid),
                                      'goal_id': str(self.goal.uuid),
                                      'body': 'Some text and an image #Test',
                                      'images': [image_file, image_file2]},
                                **{'HTTP_AUTHORIZATION': f'bearer {self.cognito.access_token}'})
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)

view.py

def post(self, request):
    post_body = request.data['body']
    hash_tags_list = extract_hashtags(post_body)
    hash_tags = [HashTag.objects.get_or_create(
        hash_tag=ht)[0].hash_tag for ht in hash_tags_list]
    request.data['hash_tags'] = hash_tags
    serializer = PostSerializer(data=request.data)
    if serializer.is_valid():
        try:
            post_obj = serializer.save()

            if 'images' in request.FILES.keys():
                for img in request.FILES.getlist('images'):
                    Photo.objects.create(post_id=post_obj, image=img)

            # if len(hash_tags) > 0:
            #     post_obj.hash_tags.set(hash_tags)
        except django.db.utils.InternalError as e:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Вернуться на верх