Django测试多图片上传接口时request.FILES为空如何正确构造请求
解决方案
核心问题原因
- 错误使用
application/json作为请求内容类型:JSON格式无法传输二进制文件数据,上传文件必须使用multipart/form-data格式,Django测试客户端检测到参数包含文件对象时会自动设置该类型,无需手动指定。 - 多文件参数构造不符合Django解析规则:Django默认不支持直接将列表作为文件参数值,需要为每个文件参数添加索引后缀。
- 代码存在语法问题:原测试代码中
data字典的images字段后缺少逗号,FILES参数中引用了未定义的image_files变量。
修正后的测试代码
from django.core.files.base import ContentFile from django.core.files.uploadedfile import SimpleUploadedFile from PIL import Image from six import BytesIO def create_image(storage, filename, size=(100, 100), image_mode='RGB', image_format='PNG'): """ 生成测试图片,若storage为None则直接返回BytesIO对象 """ 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): # 生成两个独立的测试图片文件,避免复用同一对象出现异常 image1 = create_image(None, 'test1.png') image_file1 = SimpleUploadedFile('test1.png', image1.getvalue()) image2 = create_image(None, 'test2.png') image_file2 = SimpleUploadedFile('test2.png', image2.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', # 多文件参数添加索引后缀,Django会自动解析为列表 'images[0]': image_file1, 'images[1]': image_file2 } # 无需手动指定content_type,也不需要单独传递FILES参数 ) self.assertEqual(response.status_code, status.HTTP_201_CREATED)
DRF序列化器配套配置
如果使用Django REST Framework,需要确保序列化器对多图片字段做适配:
from rest_framework import serializers class PostSerializer(serializers.ModelSerializer): # 配置多图片接收字段 images = serializers.ListField( child=serializers.ImageField(allow_empty_file=False), write_only=True ) # 其余字段、逻辑配置省略
配置完成后即可通过request.FILES.getlist('images')获取到所有上传的图片,DRF序列化器也会自动完成参数校验和读取。
内容的提问来源于stack exchange,提问作者user12314098
相关产品推荐
相关产品推荐

