2015-06-04 39 views
2

我有一個視圖,它需要登錄用戶輸入,然後運行一個函數來生成報告。結果將返回到HTML頁面中。我也將報告呈現爲PDF。用戶註銷時刪除舊的臨時文件

我使用我的功能中的內容創建一個PDF並將其保存在服務器上的某個文件夾中。我不想讓我的服務器充滿每次運行的文件,因此我爲每個用戶在登錄時創建一個臨時文件夾(在tmpfs中),並將路徑保存在會話中,這不是永久性的。

session['temp_path'] = '/dev/shm/<random_uuid>/' 

用戶可能通過單擊註銷按鈕註銷,或者他們的會話可能會過期。如何在註銷後刪除用戶的臨時文件夾?

+0

什麼是random_uuid?用戶名是否爲uuid? – felipsmartins

+0

@felipsmartins random_uuid只是它們文件夾的標籤,它只是它們文件夾的隨機名稱。 UUID僅被選擇爲文件夾的唯一名稱 – Krt

回答

0

如果有人對這個問題感興趣,我以另一種方式解決了它。我不檢查用戶是否註銷或分別創建任何cron腳本。

我創建了一個Object,它爲創建的每個pdf運行一個計數線程。經過一段時間後,pdf將被刪除。

代碼如下所示:

class TimeSet(set): 
    def add(self, item, timeout): 
     set.add(self, item) 
     t = threading.Thread(target=timeout_set_remove, args=(self, item, timeout)) 
     t.start() 

def timeout_set_remove(my_set, item, timeout): 
    time.sleep(timeout) 
    os.remove(str(item)) 
    my_set.remove(item) 

在我的燒瓶程序,我用它是這樣的:

set = TimeSet() 
set.add(os.path.abspath(os.path.join(src_path, pdf_name)), app.config['PDF_PERSISTENCE']) 

其中pdf_name是創建的PDF的名稱,src_path是路徑到文件。持久時間在我的配置文件中定義。

0

點擊註銷按鈕和過期會話一樣,對吧?

有兩種方法可以做到這一點:1)將代碼添加到清理臨時文件的會話過期例程中,和/或2)編寫一個cron腳本,用於檢查活動會話並清理臨時文件非活動會話。

+0

Click做同樣的事情。但我不知道任何代表您的「過期例程」的函數......我可以將該命令放在註銷函數中,但我不確定當用戶被自動踢出時是否調用了相同的函數...... – Krt

+0

關於'cron'腳本,這個任務對於服務器來說RAM或功耗如何?如何設計這個cron腳本的最佳方式是什麼?我可以想象創建例如。 APScheduler的工作是刪除一個文件夾,但如何告訴它何時做它的工作?如何檢查用戶會話之前登錄例如。一個小時仍然存在? – Krt

+0

我認爲您需要研究Flask會話以瞭解會話過期的情況,以及它們是否與註銷代碼時相同。是的,你可以使用APScheduler而不是cron,但是你應該問這是另一個問題。 –