测试使用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
相关产品推荐
相关产品推荐

