2009-09-21 10 views
5

Szukam sposobu na sprzedanie komuś karty na imprezie, która będzie miała unikalny kod, który będzie mógł później wykorzystać, aby pobrać plik (mp3, pdf itp.) Tylko jeden raz i maskę prawdziwa lokalizacja pliku, więc osoba doświadczona, pobierająca plik, nie będzie mogła pobrać tego pliku więcej niż raz. Byłoby miło hostować plik na Amazon S3, aby zaoszczędzić na przepustowości, w której nasz serwer jest zlokalizowany.Co to jest rozwiązanie Django/Python do dostarczania jednorazowego adresu URL do pobierania plików?

Moja myśl o kodach polega na wstępnym wygenerowaniu niepowtarzalnych kodów, które zostaną wydrukowane na kartach i zapisaniu ich w bazie danych, która może również zawierać pole przechowujące liczbę pobrań pliku. W ten sposób możemy ustawić liczbę prób, które pozwolilibyśmy użytkownikowi na pobranie pliku.

Częścią, której potrzebuję kierunku, jest to, jak ukryć/zamaskować oryginalną lokalizację pliku, aby ludzie nie mogli ukraść tego adresu URL, a następnie pobrać plik tyle razy, ile chcą. Zrobiłem wyszukiwania w Google i albo nie szukam przy użyciu właściwych słów kluczowych, albo nie ma zbyt wielu bibliotek lub fragmentów już tam dla tego typu rzeczy.

Zgaduję, że być może uda mi się poradzić sobie z czymś przy użyciu django.views.static.serve, który działa jako rodzaj pośrednika między rzeczywistym plikiem a użytkownikiem pobierającym plik. Jedyną wadą tej metody wydaje mi się, że musiałbym używać rzeczywistego serwera WWW i nie byłbym w stanie przechowywać pliku na Amazon S3.

Wszelkie sugestie lub przemyślenia są mile widziane.

Odpowiedz

2

Możesz po prostu użyć czegoś prostego, takiego jak mod_xsendfile. Ta funkcja jest również dostępna w innych popularnych serwerach internetowych, takich jak lighttpd lub nginx.

Działa to w następujący sposób: po włączeniu aplikacja (np. Trywialny skrypt PHP) może wysłać specjalny nagłówek odpowiedzi, powodując, że serwer obsługuje plik statyczny.

Jeśli chcesz, aby działał z S3, będziesz musiał obsługiwać każde żądanie w ten sposób, co oznacza, że ​​ruch będzie przechodził przez twoją stronę, stamtąd do AWS, z powrotem do twojej strony i z powrotem do klienta. Czy S3 obsługuje dowiązania/aliasy symboliczne? Jeśli tak, możesz po prostu przekierować prawidłowego użytkownika do jednego z symbolicznych adresów URL i usunąć to dowiązanie symboliczne po kilku godzinach.

3

Schludny pomysł. Ostrzegam jednak przed metodą pobierania pojedynczego, ponieważ nie ma gwarancji, że pierwsza próba pobrania zakończy się sukcesem. Być może zamiast tego używaj metody "time-expiration"?

Ale na pewno można to zrobić z Django. Oto zarys podstawowego podejścia:

  • Skonfiguruj URL django do obsługi tych plików
  • użyć parametru GET, który jest unikalny ciąg zidentyfikować plik do zdobycia.
  • Zachowaj tabelę bazy danych, która ma FileField dla pliku do pobrania. Ta tabela mapuje unikalne ciągi do lokalizacji pliku w systemie plików.
  • Służyć plik do pobrania, należy ustawić nagłówki odpowiedzi w widoku tak:

(path jest lokalizacja pliku służyć)

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 

Ponieważ używamy tego Strona Django do obsługi pliku, użytkownik nie może znaleźć oryginalnej lokalizacji pliku.

+0

To jest najbardziej podstawowe podejście, ale może sprawić, że serwer zostanie uszkodzony, jeśli serwujesz wiele z tych plików, ponieważ cały plik musi być przesyłany strumieniowo przez gruby wątek serwera Python/Django. –

+0

Tak, to nie jest superszybkie rozwiązanie, ale wydaje się, że w jego sytuacji wydajność nie będzie problemem. Musi fizycznie sprzedawać każdemu użytkownikowi kartę, więc nie spodziewałbym się niczego blisko nawet 100 pobrań dziennie. –

Powiązane problemy