python - 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)
解决方案
我设法想出了这个解决方案。请告诉我这是否是执行此操作的“正确方法”
测试.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)
推荐阅读
- java - 加入条件生成器中的 getOn 不起作用
- azure - Azure 数据工厂 - CRM (OData) 连接器
- python - 如何匹配两个不同列表中的项目并根据python中的匹配项创建一个新列表?
- php - PHP $_POST 为空 - 只显示“Array ( )”
- c# - 如何在数组中报告后台工作人员的进度
- c++ - 如何将套接字绑定到 ipv6 地址?
- drake-r-package - 从德雷克缓存中删除未使用的和旧的目标
- javascript - 如何修复 Javascript 在转换为核心 2.2 后不再工作
- python - 如何将 NumPy 数组按元素舍入到第一个非零数字?
- tensorflow - 使用 TensorFlow Hub 模型重新创建 BERT extract_features.py 输出