Django测试中SimpleUploadedFile未传入request.FILES问题求助
以下是几个排查和解决方向:
确认测试请求的参数传递方式
调用self.client.post时,文件参数通过files字典传入即可,不要手动指定content_type参数。如果强行设置content_type='multipart/form-data',反而可能导致Django无法正确解析文件——测试客户端会自动根据files参数生成正确的multipart请求头。示例正确写法:from django.core.files.uploadedfile import SimpleUploadedFile def test_upload_view(self): test_file = SimpleUploadedFile('test.jpg', b'file_content', content_type='image/jpeg') response = self.client.post('/upload/', {'file_field_name': test_file})检查视图中表单的字段名匹配
确保测试里files字典的键,和视图处理的表单字段名完全一致。比如表单定义的是image = forms.ImageField(),测试就要传{'image': test_file},否则request.FILES里找不到对应字段。排查自定义中间件的影响
即便CommonMiddleware配置正确,也要检查自定义中间件是否在处理请求时意外清空了request.FILES,或者修改了请求的内容类型。可以暂时禁用自定义中间件测试,看是否恢复正常。验证SimpleUploadedFile的参数有效性
确保文件的content_type设置正确,文件名包含合法后缀(比如.jpg、.png),避免因文件类型验证导致Django丢弃文件。另外,文件内容不能是空字节(比如用b'some_content'而非空值)。检查视图的请求方法限制
确认视图只接受POST请求,且没有在处理前重定向(重定向会丢失POST数据和文件)。比如使用require_POST装饰器的视图,要确保测试用的是POST方法。
内容的提问来源于stack exchange,提问作者InOutLake

