2011-07-07 10 views
10

Verilerimi barındırmak için django staticfiles + django-storages ve Amazon S3 kullanıyorum. Her şey iyi çalışıyor, her defasında manage.py collectstatic'u çalıştırdığımda komut, tüm dosyaları sunucuya yükler.Django StaticFiles ve Amazon S3: Değiştirilen dosyaları nasıl algılayabilirim?

Yönetim komutunun, s3 deposunda django depolarından kullanılmayan Storage.modified_time() zaman damgalarını karşılaştırması gibi görünüyor.

S3 dosyasının değiştirilip değiştirilmediğini nasıl belirlersiniz?

Veritabanımdaki dosya yollarını ve son değiştirilen verileri depolayabilirim. Ya da son değiştirilen verileri Amazon'dan çekmenin kolay bir yolu var mı?

Başka bir seçenek: İlk kez yüklediğimde yerel değiştirilme tarihini koyabildiğim python-boto ile isteğe bağlı meta verileri atayabilir gibi görünüyor.

Her neyse, ortak bir sorun gibi görünüyor, bu yüzden başkalarının kullandığı çözümü sormak istiyorum. Teşekkürler!

cevap

10

django-storages (1.1.3) 'un en son sürümü, S3 Boto aracılığıyla dosya değiştirme algılamayı gerçekleştirir.

pip install django-storages ve şimdi iyisin :) Açık kaynağı sevmelisin!

Güncelleme: S3Boto sınıfını kullanıyorsanız çok hızlı senkronizasyona sahip olmak için AWS_PRELOAD_METADATA seçeneğini True ayarlarına getirin. Onun S3 kullanıyorsanız, PreloadedS3 sınıfını kullanın.


Güncelleştirme 2: Komutu çalıştırmak son derece yavaştır.


Güncelle 3: I forked the django-storages repository sorunu gidermek ve bir çekme isteği ekledi.

Sorun, kullanılmıyor olsa bile geri dönüş değeri çağrıldığı modified_time yöntemindedir. Ben get döner None

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

Şimdi performans farkı 100'lerce 1000 istekleri için < .5s dan

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

olmalı yalnızca bir if bloğuna geri dönüş yürütülecek taşındı


Güncelleme 4:

10k + dosyalarının eşleştirilmesi için, boto'nun 5-10 saniyelik bir eşzamanlama süresine neden olan sonuçları belirttiğinden boto'nun birden çok istekte bulunması gerektiğine inanıyorum. Bu daha fazla dosya aldıkça daha da kötüleşecek.

Bir çözümün, bir dosyanın herhangi bir dosyayı collectstatic komutu aracılığıyla güncelleştirildiği zaman güncelleştirilen, diğer dosyaların meta verilerine sahip olduğu bir dosyanın saklandığı bir özel yönetim komutuna veya django-storages güncelleştirmesine sahip olduğumu düşünüyorum.

Diğer yollarla yüklenen dosyaları algılamaz, ancak tek giriş noktasının yönetim komutu olup olmaması fark etmez.

+0

Nasıl değiştir_time yöntemini kullanıyorsunuz? Sadece çalışıyor. /manage.py collecstatic, benim için çalışmıyor. Dosyaları kaydetmek için botos3'ten _save yöntemini kullanır, ancak dosya yeniyse veya olmasın herhangi bir zamanda kontrol etmez. Senin çözümün nedir? – duduklein

+0

Bu artık doğru gibi görünmüyor: python-dateutil> 2.1 şimdi hem Python 2'yi hem de 3'ü ortak bir kod tabanında destekliyor ve python-dateutil == 2.1 botos3 ile benim için iyi çalışıyor. –

+0

Hey Yuji; Bu aynı konuya koşuyorum (birkaç bin dosya ile S3Boto ile gerçekten yavaş collectstatics). Bunu nereye eklediğinizi merak ediyorum. Bu süreci optimize etmek için mevcut en iyi tavsiyelerinizi özetleyebilir misiniz, çünkü bu konuyla ilgili çok fazla zaman harcadınız mı? –

0

Aynı soruya burada da cevap verdim https://stackoverflow.com/a/17528513/1220706. https://github.com/FundedByMe/collectfast'a bakın. Uzak S3 dosyalarının ETag'sini önbelleğe alan ve her seferinde bir arama yapmak yerine önbelleğe alınmış sağlama toplamını karşılaştıran takılabilir bir Django uygulaması. Yükleme yönergelerini izleyin ve collectstatic'u normal şekilde çalıştırın. Dağıtımda ortalama 1m30s ile 10s arasında bir ortalamadan aldı.