4

那里的直升机,

我正在寻找一种方法来限制 Python 中文件的生命周期,即创建一个将在创建后 5 分钟后自动删除的文件。


问题:

我有一个基于 Django 的网页,该网页具有生成图(从用户提交的输入数据)的服务,这些图在网页上显示为 .png 图像。图像在创建时存储在磁盘上。

图像文件是按会话创建的,并且只能在用户看到它们后的有限时间内可用,并且应该在创建后 5 分钟被删除。


可能的解决方案:

  1. 我查看了 Python 临时文件,但这不是我需要的,因为用户应该能够返回到包含图像的页面,而无需等待它再次生成。换句话说,它不应该在关闭后立即销毁

  2. 想到的另一种方法是调用某种外部 bash 脚本,该脚本将删除超过 5 分钟的文件。

有人知道这样做的首选方式吗?

想法还可以包括更改显示/生成图像文件的逻辑。

4

2 回答 2

2

您应该编写一个Django 自定义管理命令来删除可以从 cron 调用的旧文件。

如果您不想要超过 5 分钟的文件,那么您当然需要每 5 分钟调用一次。是的,当没有用户时它会不必要地运行,但这不应该让你太担心。

于 2012-09-08T11:42:20.313 回答
1

好吧,我猜这可能是一个好方法......

您可以编写一个脚本来检查您的目录并删除过时的文件,并从未删除的文件中选择最旧的文件。计算自创建该文件以来经过了多少时间,并计算删除该文件的剩余时间。然后sleep用剩余时间调用函数。当sleep时间结束并开始另一个循环时,将(至少)有一个文件要删除。如果目录中没有文件,请将sleep时间设置为 5 分钟。

这样你可以确保每个文件在 5 分钟后被删除,但是当同时创建的文件很多时,睡眠时间会大大减少,你的函数会越来越频繁地检查每个文件。为了避免在开始另一个循环之前为睡眠功能添加适当的延迟,例如,如果最旧的文件有 4 分钟的历史,您可以将睡眠设置为60+30秒(添加所有时间计算 30 秒)。

一个例子:

from datetime import datetime
import time
import os

def clearDirectory():
    while True:
        _time_list = []
        _now = time.mktime(datetime.now().timetuple())
        for _f in os.listdir('/path/to/your/directory'):
            if os.path.isfile(_f):
                _f_time = os.path.getmtime(_f) #get file creation/modification time
                if _now - _f_time < 300:
                    os.remove(_f) # delete outdated file
                else:
                    _time_list.append(_f_time) # add time info to list
        # after check all files, choose the oldest file creation time from list
        _sleep_time = (_now - min(_time_list)) if _time_list else 300 #if _time_list is empty, set sleep time as 300 seconds, else calculate it based on the oldest file creation time
        time.sleep(_sleep_time)

但正如我所说,如果经常创建文件,最好设置睡眠时间的延迟

time.sleep(_sleep_time + 30) # sleep 30 seconds more so some other files might be outdated during that time too...

此外,最好阅读getmtime函数以获取详细信息。

于 2012-09-08T11:42:05.590 回答