2012-10-25 99 views
2

我有一個Django應用程序,它使用FileSystemStorage進行開發,使用S3BotoStorage進行分期和生產。一切工作正常。有跡象表明,我已經注意到了這些系統之間的一些小的差異:Django存儲系統的差異

  1. FileSystemStorage將追加MEDIA_ROOT值,它 保存的任何文件。 S3BotoStorage默認不會。

  2. 如果我刪除了的FileField模型實例,S3BotoStorage將 刪除的FileField的文件,該文件所在的目錄,如果 文件在該目錄中的唯一文件。 FileSystemStorage不會刪除空目錄 。

我可以解決這些差異,但它們會爲我的代碼添加條件。第一個是最簡單的 - 我只用location=MEDIA_ROOT初始化S3BotoStorage類。有沒有辦法以類似的方式處理第二個?我可以配置存儲類的目錄刪除行爲嗎?我應該重寫FileSystemStorage的刪除方法嗎?

+4

S3BotoStorage根本不會「刪除文件夾」;實際上S3甚至沒有文件夾。相反,S3通過密鑰存儲所有數據。因爲S3Boto模擬一個普通的文件存儲,它使用諸如「foo/bar/baz.txt」之類的鍵,但它可以很容易地使用「foo; bar | baz.text」,並且S3不會閃爍。無論如何,如果你有兩個帶有「foo/bar」和「foo/baz」鍵的文件,大多數S3工具都會在文件夾「foo」中顯示文件「bar」和「baz」,但實際上它們是兩個單獨的密鑰。如果你刪除了兩個鍵,你的工具將使它看起來像一個文件夾被刪除,但實際上它從來沒有開始。 – machineghost

+1

感謝您的評論。這在你的解釋後顯得很明顯 - 謝謝! – Erik

回答

3

FileSystemStorage.delete(線144)沒有,我可以看到任何配置代碼:

def delete(self, name): 
    name = self.path(name) 
    # If the file exists, delete it from the filesystem. 
    # Note that there is a race between os.path.exists and os.remove: 
    # if os.remove fails with ENOENT, the file was removed 
    # concurrently, and we can continue normally. 
    if os.path.exists(name): 
     try: 
      os.remove(name) 
     except OSError as e: 
      if e.errno != errno.ENOENT: 
       raise 

所以,是的,最簡單和乾淨的方法是可能覆蓋它的刪除方法額外檢查空目錄的情況。

+0

我真的需要養成早先查看源代碼的習慣。謝謝! – Erik