2009-09-21 10 views
5

Bir dosyayı, bir dosyayı (mp3, pdf, vb.) Yalnızca bir kez ve maskeyi indirmek için kullanabilecekleri benzersiz bir koda sahip olacağı bir etkinlikte bir kart satmanın bir yolunu arıyorum. doğru dosya konumu bu yüzden dosyayı indiren bir kullanıcı, dosyayı bir kereden fazla indiremez. Sunucumuzun birlikte konumlandığı bant genişliğini kaydetmek için dosyayı Amazon S3'te barındırmak güzel olurdu.insanlar dosyalarını indirmek için bir kerelik url sağlamak için Django/Python çözüm nedir?

Kodlar hakkındaki düşüncelerim, kartlara basılacak benzersiz kodları önceden oluşturmak ve bunları, dosyanın indirilme sayısını saklayan bir alana sahip olabilecek bir veritabanında saklamak olacaktır. Bu şekilde, kullanıcının dosyayı indirmesine izin vereceğimiz kaç denemeyi ayarlayabiliriz.

Yönlendirmem gereken kısmı, kullanıcıların bu url'yi çalamadığı ve dosyayı istedikleri kadar karşıdan yükleyememesi için orijinal dosya konumunu nasıl gizlerim/gizlerim. Ben Google aramaları yaptık ve ben de doğru anahtar kelimeleri kullanarak arama değilim ya da çok sayıda kütüphaneler veya parçacıkları bu tür bir şey için zaten orada yoktur.

Sanırım gerçek dosya ile dosyayı karşıdan yükleyen kullanıcı arasında bir çeşit proxy gibi davranan django.views.static.serve kullanarak bir şeyler hazırlayabileceğimi tahmin edebilirim. Bu yöntemin tek dezavantajı, gerçek web sunucusunu kullanmam gerekecek ve dosyayı Amazon S3'te saklayamayacağımdı.

Herhangi bir öneri veya düşünce büyük takdir edilmektedir.

cevap

2

mod_xsendfile gibi basit bir şeyi kullanabilirsiniz. Bu işleve lighttpd veya nginx böyle diğer popüler websunucularda mevcuttur.

Bu şekilde çalışır: etkinleştirildiğinde, uygulamanız (örn. Önemsiz bir PHP betiği) özel bir yanıt üstbilgisi göndererek web sunucusunun statik bir dosyaya neden olmasına neden olabilir.

S3 ile çalışmasını istiyorsanız, her bir isteği bu şekilde ele almanız gerekir. Bu, trafiğin sitenizden, AWS'ye, sitenize geri döndüğü ve müşteriye geri döneceği anlamına gelir. S3 sembolik linkleri/takma adları destekliyor mu? Öyleyse geçerli bir kullanıcıyı sembolik URL'lerden birine yönlendirebilir ve birkaç saat sonra söz konusu bağlantıyı silebilirsiniz.

3

Temiz fikir. Bununla birlikte, tek indirme yöntemine karşı uyarıda bulunacağım, çünkü ilk indirme girişimlerinin başarılı olacağına dair bir garanti yoktur. Belki bunun yerine bir zaman son kullanma yöntemini kullanın?

Ancak bunu Django ile yapmak kesinlikle mümkündür. İşte temel yaklaşımın ana hatları yer almaktadır:

  • bu dosyaları
  • Kullanım almak için hangi dosya tanımlamak için benzersiz bir dizedir GET parametresi hizmet için Django url ayarlayın.
  • dosya indirmek için FileField olan bir veritabanı tablosu tutun. Bu tablo, benzersiz dizeleri dosya sistemi üzerindeki dosyanın konumuna eşler.Bu kullandığımız için

with open(path, 'rb') as f: 
    response = HttpResponse(f.read()) 
response['Content-Type'] = 'application/octet-stream'; 
response['Content-Disposition'] = 'attachment; filename="%s"' % 'insert_filename_here' 
return response 

(path hizmet etmek dosyanın konumudur):

  • böyle görünümünde yanıt başlıklarını ayarlamak, indirilerek dosyayı hizmet etmek Dosyaya hizmet veren Django sayfası, kullanıcı orijinal dosya konumunu bulamıyor.

  • +0

    Bu en temel yaklaşım olmakla birlikte, tüm dosya şişman Python/Django sunucu iplik üzerinden akış zorundadır ettiklerinden bu dosyaların bir çok hizmet eğer sunucu zarar yapabiliriz. –

    +0

    Evet, bir süper hızlı çözüm değil, ama onun durumdaki performansı bir sorun olmayacak gibi görünüyor. Her kullanıcıya fiziksel olarak bir kart satması gerekiyor, bu yüzden günde 100 indirmeye bile yakın bir yerde beklemeyeceğim. –

    İlgili konular