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

测试使用TemporaryUploadedFile的Django视图时上传数据为空怎么解决

问题原因

Django测试客户端默认发送POST请求时使用application/x-www-form-urlencoded编码,这种编码格式不支持文件传输,所以你传入的文件对象不会被解析到request.FILES中,导致视图拿到空的FILES对象。

解决方法

你可以通过以下两种方式修复测试代码,不需要修改原有视图逻辑:

方法1:使用files参数传递上传文件(推荐)

Django测试客户端的post方法专门提供了files参数用于接收上传文件对象,会自动设置正确的编码格式。同时你需要补充测试文件的实际内容,避免pandas读取空文件出错。

修改后的测试代码示例:

from django.core.files.uploadedfile import TemporaryUploadedFile
from django.test import TestCase
import os

class InputTest(TestCase):
    def test_extract_csv(self):
        # 1. 读取本地测试CSV的实际内容
        test_file_path = "data/test.csv"
        file_size = os.path.getsize(test_file_path)
        with open(test_file_path, 'rb') as f:
            file_content = f.read()

        # 2. 构造正确的TemporaryUploadedFile,content_type使用标准MIME格式
        temp_file = TemporaryUploadedFile(
            name="test.csv",
            content_type="text/csv",
            size=file_size,
            charset="utf-16-le"
        )
        # 写入实际的文件内容
        temp_file.write(file_content)
        # 重置文件指针到开头,避免后续读取为空
        temp_file.seek(0)

        # 3. 发送请求时将文件放到files参数中
        response = self.client.post(
            "/ingest",
            data={}, # 其他普通表单字段放在此处
            files={"upload_file": temp_file}
        )

        # 可根据业务逻辑补充响应断言
        self.assertEqual(response.status_code, 200)

方法2:显式指定请求编码格式

如果你不想拆分data和files参数,也可以直接在post请求中指定format="multipart",让客户端按文件上传格式解析请求内容:

# 构造temp_file的逻辑和方法1一致
form_data = {
    'upload_file': temp_file
}
self.client.post("/ingest", form_data, format="multipart")
额外注意事项
  • 原有代码中TemporaryUploadedFile的content_type参数填的是"csv",不符合MIME格式规范,建议修改为标准的"text/csv",避免部分解析逻辑识别异常。
  • 构造TemporaryUploadedFile后必须写入实际的文件内容,否则pandas读取时会拿到空DataFrame或者报错。

内容的提问来源于stack exchange,提问作者ic_fl2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:09:03