django-import-export导入报错:临时文件不存在(FileNotFoundError)
解决django-import-export导入时FileNotFoundError的永久方案
问题根源
这个错误是因为django-import-export默认使用系统/tmp目录存储上传的临时文件,而系统会定时清理/tmp下的过期文件,或因权限问题导致文件读取失败。浏览器缓存了旧的临时文件引用后,再次请求时文件已被清理,所以清缓存能临时解决,但无法根治。
永久解决方法
1. 自定义项目内临时文件存储类
放弃系统/tmp,改用项目专属的临时目录,避免被系统自动清理。
首先在项目根目录创建tmp文件夹,并确保Django进程有读写权限:
mkdir project_root/tmp chmod 755 project_root/tmp
然后定义自定义存储类(可放在app/utils.py中):
from import_export.tmp_storages import TempFolderStorage import os from django.conf import settings class ProjectTempStorage(TempFolderStorage): def get_temp_dir(self): # 使用项目内的tmp目录 temp_dir = os.path.join(settings.BASE_DIR, 'tmp') os.makedirs(temp_dir, exist_ok=True) return temp_dir
最后在Admin类中指定使用该存储类:
@admin.register(Stock) class StockAdmin(ImportMixin, SimpleHistoryAdmin): # ... 保留原有代码 ... resource_class = StockResource # 添加临时存储类配置 tmp_storage_class = ProjectTempStorage
2. 正确配置CacheStorage(修正之前的无效配置)
如果想用CacheStorage,需确保Django缓存配置为分布式缓存(如Redis、Memcached,不建议用默认的LocMemCache,多进程环境下会出现缓存不共享问题),然后全局或局部配置:
全局配置(settings.py):
IMPORT_EXPORT_TMP_STORAGE_CLASS = 'import_export.tmp_storages.CacheStorage'
局部配置(Admin类中):
@admin.register(Stock) class StockAdmin(ImportMixin, SimpleHistoryAdmin): # ... 保留原有代码 ... tmp_storage_class = 'import_export.tmp_storages.CacheStorage'
3. 调整系统tmp目录清理策略(仅适用于有权限的服务器)
若必须使用系统/tmp,可修改临时文件清理规则。例如在/etc/tmpfiles.d/django-import-export.conf中添加:
d /tmp 1777 root root 7d
该配置会让/tmp下的文件保留7天,避免被快速清理,具体规则可根据系统tmpfiles配置调整。
额外优化建议
- 优化
before_import_row中的数据库查询,使用select_related或缓存查询结果,减少导入耗时,降低临时文件被清理的概率。 - 确保上传文件大小在Django配置的
FILE_UPLOAD_MAX_MEMORY_SIZE范围内,超过阈值的文件会写入临时文件,增加被清理的风险。
内容的提问来源于stack exchange,提问作者Ronny Portillo
相关产品推荐
相关产品推荐

