Python 使用Django测试上载图像时出现多值错误
嗨,我正在尝试做一个测试用例来测试我的上传图像API。但是当我将文件传递给Python 使用Django测试上载图像时出现多值错误,python,django,post,django-rest-framework,django-testing,Python,Django,Post,Django Rest Framework,Django Testing,嗨,我正在尝试做一个测试用例来测试我的上传图像API。但是当我将文件传递给request.files #models.py class Image(models.Model): name = models.CharField(max_length=200) imagefile = models.ImageField( null=True, blank=True, max_length=500, upload_to='
request.files
#models.py
class Image(models.Model):
name = models.CharField(max_length=200)
imagefile = models.ImageField(
null=True,
blank=True,
max_length=500,
upload_to='temp/images/')
def __str__(self):
return self.name
#views.py
class ImagesView(APIView):
def post(self, request):
print("DATA!!!", request.data)
print("FILE!!!", request.FILES)
params = Image(
imagefile=request.FILES['image'])
params.save()
print(params)
return Response({"status": "ok"})
#test.py
class CanalImagesApiTests(TestCase):
fixtures = []
def test_post_image(self):
c = Client()
response = c.post('/admin/login/', {'username': 'admin', 'password': 'passwrd'})
filename = 'data/sample_image.jpg'
name = 'sample_image.jpg'
data = {"data": "passthis"}
print(to_upload)
with open(filename, 'rb') as f:
c.post('/images/', data=data, files={"name": name, "image": f}, format='multipart')
response = c.get('/images/')
results = response.json()
我的请求.FILES
为空:
我的测试得到一个错误:django.utils.datastructures.MultiValueDictKeyError:'image'
- 可以在数据字典中传递文件对象李>
不需要参数<代码>格式参数表示输出格式,而不是输入格式李>文件
- 如果要测试Django REST框架API,可以使用
而不是APITestCase
。这允许您测试一些方法,如TestCase
李>PUT
来自rest\u框架导入状态
从rest_framework.test导入APITestCase
类别CanalImagesApiTests(APITestCase):
def测试后图像(自身):
将open('data/sample_image.png','rb')作为f:
数据={
“数据”:“passthis”,
“图像”:f,
}
response=self.client.post('/images/',data=data)
self.assertEqual(response.status\u代码,status.HTTP\u 200\u OK)
self.assertEqual(response.json(),{“status”:“ok”})
测试结果(合格):
数据!!!
文件
- 可以在数据字典中传递文件对象李>
不需要参数<代码>格式参数表示输出格式,而不是输入格式李>文件
- 如果要测试Django REST框架API,可以使用
而不是APITestCase
。这允许您测试一些方法,如TestCase
李>PUT
来自rest\u框架导入状态
从rest_framework.test导入APITestCase
类别CanalImagesApiTests(APITestCase):
def测试后图像(自身):
将open('data/sample_image.png','rb')作为f:
数据={
“数据”:“passthis”,
“图像”:f,
}
response=self.client.post('/images/',data=data)
self.assertEqual(response.status\u代码,status.HTTP\u 200\u OK)
self.assertEqual(response.json(),{“status”:“ok”})
测试结果(合格):
数据!!!
文件
我收到错误:AssertionError:测试数据包含键“data”的字典值,但多部分上载不支持嵌套数据。您可能想考虑在这个测试用例中使用Frase=“JSON”。我的“DATA”有另一个字典,这就是为什么。您不能发送带有“代码>内容类型:多部分/表单数据< /代码>的嵌套字典。您可以使用内容类型:application/json
发送嵌套字典,但文件必须以base64编码传输,开销约为33%。我的建议是将用于上载文件的API和用于上载数据的API分开。我得到错误:AssertionError:测试数据包含键“data”的字典值,但多部分上载不支持嵌套数据。您可能想考虑在这个测试用例中使用Frase=“JSON”。我的“DATA”有另一个字典,这就是为什么。您不能发送带有“代码>内容类型:多部分/表单数据< /代码>的嵌套字典。您可以使用内容类型:application/json
发送嵌套字典,但文件必须以base64编码传输,开销约为33%。我的建议是将上传文件的API和上传数据的API分开。
DATA!!! <QueryDict: {'data': ['passthis'], 'image': [<InMemoryUploadedFile: sample_image.png (image/png)>]}>
FILE!!! <MultiValueDict: {'image': [<InMemoryUploadedFile: sample_image.png (image/png)>]}>