4

こんにちは、

Python でファイルの有効期間を制限する方法、つまり、作成後 5 分後に自動削除されるファイルを作成する方法を探しています。


問題:

Web ページに .png 画像として表示される (ユーザーが送信した入力データから) プロットを生成するサービスを備えた Django ベースの Web ページがあります。イメージは、作成時にディスクに保存されます。

画像ファイルはセッションごとに作成され、ユーザーがそれらを見てから限られた時間のみ利用可能であり、作成されてから 5 分後に削除する必要があります。


可能な解決策:

  1. Python tempfile を見てきましたが、それは必要なものではありません。ユーザーは、画像が再度生成されるのを待たずに、画像を含むページに戻ることができる必要があるためです。つまり、閉じたらすぐに破棄すべきではありません

  2. 頭に浮かぶもう1つの方法は、5分以上経過したファイルを削除する何らかの外部bashスクリプトを呼び出すことです。

これを行う好ましい方法を知っている人はいますか?

アイデアには、画像ファイルの表示/生成のロジックを変更することも含まれます。

4

2 に答える 2

2

cron から呼び出すことができる古いファイルを削除するには、Django カスタム管理コマンドを作成する必要があります

5分以上前のファイルが必要ない場合は、もちろん5分ごとに呼び出す必要があります。はい、ユーザーがいない場合は不必要に実行されますが、それほど心配する必要はありません。

于 2012-09-08T11:42:20.313 に答える
1

わかりました、それは良いアプローチかもしれません...

ディレクトリをチェックして古いファイルを削除するスクリプトを作成し、削除されていないファイルから最も古いファイルを選択できます。そのファイルが作成されてからの経過時間を計算し、そのファイルの削除までの残り時間を計算します。次にsleep、残り時間で関数を呼び出します。時間がsleep終了して別のループが始まると、(少なくとも) 1 つのファイルが削除されます。ディレクトリにファイルがない場合は、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 に答える