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)