Python 使用Django测试上载图像时出现多值错误

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='

嗨,我正在尝试做一个测试用例来测试我的上传图像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='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)>]}>