首页 > 解决方案 > Django - 编写测试以上传多个图像

问题描述

我在下面有这个代码,它生成一个假图像,然后尝试将它发送到这个端点。我在第一行有一个断点,def post(self, request)当我查看时我request.data没有看到图像键,当我看到时request.FILES,它是一个空的多字典。我试图允许用户上传多张图片,这就是它在列表中的原因。如何正确地将图像添加到请求以测试上传?

测试.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),
                                      'goal_id': str(self.goal.uuid),
                                      'images': [image_file, image_file]
                                      'body': 'Some text and an image #Test'},
                                
                                FILES={'images': [image_file, image_files]},
                                content_type='application/json')
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)

视图.py

def post(self, request):
    serializer = PostSerializer(data=request.data)
    if serializer.is_valid():
        try:
            post_obj = 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)

标签: pythondjango

解决方案


我设法想出了这个解决方案。请告诉我这是否是执行此操作的“正确方法”

测试.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)

视图.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)

推荐阅读