2012-09-08 15 views
3

直升機那裏,限制文件的壽命在Python

我正在尋找一種方式來限制Python中的文件的一生,那就是,使該會在5分鐘後自動刪除的文件創建後。


問題:

我有具有被顯示在網頁上作爲png格式圖像生成圖(從用戶提交的輸入數據)的服務的基於Django的網頁。圖像在創建時被存儲在磁盤上。

圖像文件是按照會話基礎創建的,並且應該只在用戶看到它們後的有限時間內可用,並且應該在創建後5分鐘內刪除。


可能的解決方案:

  1. 我看過Python的臨時文件,但是這不是我所需要的,因爲用戶應該能夠返回包含圖像,而不在頁面等待它再次生成。換句話說,一旦它關閉,它就不應該被銷燬

  2. 想到的另一種方法是調用某種外部bash腳本,該腳本會刪除大於5分鐘的文件。

有沒有人知道這樣做的首選方法?

想法還可以包括更改顯示/生成圖像文件的邏輯。

+1

最好的方式看起來像寫一個腳本,將檢查文件和刪除舊文件。此外,將其添加到cronjob列表將保證您的腳本正在運行。 – FallenAngel

+1

相關,並可能有所幫助http://stackoverflow.com/questions/3582414/removing-tmp-file-after-return-httpresponse-in-django – 18bytes

+0

@Alan我會使用一個cron作業以及 – 18bytes

回答

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) 

但正如我所說,如果oftenly創建的文件,最好是將延遲時間設置爲睡眠時間

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

而且,它是更好的閱讀getmtime功能的細節。

2

您應該編寫一個Django custom management command來刪除可以從cron調用的舊文件。

如果你不想要5分鐘以上的文件,那麼你需要每隔5分鐘給它打電話。是的,當沒有用戶時它會不必要地運行,但是不會擔心你太多。