2011-07-07 53 views
10

我使用django staticfiles + django-storages和Amazon S3來託管我的數據。除了每次運行manage.py collectstatic時,所有操作都很好,該命令會將所有文件上載到服務器。Django StaticFiles和Amazon S3:如何檢測修改後的文件?

看起來管理命令比較了來自Storage.modified_time()的時間戳,這個時間戳在django-storages的S3存儲中沒有實現。

你們如何確定S3文件是否被修改?

我可以在我的數據庫中存儲文件路徑和上次修改的數據。或者有沒有簡單的方法來從亞馬遜拉最後修改的數據?

另一種選擇:它看起來像我可以分配任意元數據與python-boto我可以把我第一次上傳時的本地修改日期。

無論如何,這似乎是一個普遍的問題,所以我想問問別人使用了什麼解決方案。謝謝!

回答

10

最新版本的django-storages(1.1.3)通過S3 Boto處理文件修改檢測。

pip install django-storages現在你很好:)得愛開源!

更新:在設置文件中將AWS_PRELOAD_METADATA選項設置爲True,以便在使用S3Boto類時具有非常快速的同步。如果使用他的S3,使用他的PreloadedS3類。


更新2:運行該命令的速度仍然非常慢。


更新3:I forked the django-storages repository解決問題並添加了拉取請求。

問題在modified_time方法中,即使未使用fallback值,也會調用fallback值。我提出要執行的回退給if塊只有get回報None

entry = self.entries.get(name, self.bucket.get_key(self._encode_name(name))) 

應該

entry = self.entries.get(name) 
    if entry is None: 
     entry = self.bucket.get_key(self._encode_name(name)) 

現在,在性能上的差異是<,5S從100S 1000個請求


更新4:

爲了同步10k +文件,我相信boto必須提出多個請求,因爲S3分頁導致5-10秒的同步時間。隨着我們獲得更多文件,這隻會變得更糟。

我想一個解決方案是有一個自定義管理命令或django-storages更新,其中一個文件存儲在S3擁有的所有其他文件,這些文件被更新文件通過collectstatic命令隨時更新的元數據。

它不會檢測通過其他方式上傳的文件,但如果唯一入口點是管理命令則無關緊要。

+0

你如何使用modified_time方法?只運行./manage.py collecstatic,不適用於我。它使用botos3中的_save方法來保存文件,但它不會隨時檢查文件是否爲新文件。你的解決方案是什麼? – duduklein

+0

這似乎不再是真的了:python-dateutil> 2.1現在支持Python 2和3共享的代碼庫,python-dateutil == 2.1對於我來說可以使用botos3。 –

+0

Hey Yuji;我遇到了這個相同的問題(與S3Boto幾千個文件真的很慢的collectstatics)。我想知道你在這個網站上的位置。你能總結一下當前最好的建議來優化這個過程嗎?因爲你已經花了很多時間來應對這個問題? –

相關問題