在Python中限制文件的生命周期

时间:2012-09-08 08:48:56

标签: django python-2.7

Helo那里,

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


问题:

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

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


可能的解决方案:

  1. 我看过Python tempfile,但这不是我需要的,因为用户必须能够返回包含图像的页面,而不必等待它再次生成。换句话说,它一关闭就不应该被销毁

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

  3. 有人知道这样做的首选方法吗?

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

2 个答案:

答案 0 :(得分:2)

你应该写一个Django custom management command来删除你可以从cron调用的旧文件。

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

答案 1 :(得分: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功能以获取详细信息。