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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:28:12