You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:36:05