2010-09-30 5 views
5

Ich habe eine Website, die den Benutzer ermöglicht, bestimmte Dateien herunterladen. Ich möchte jedoch eine Download-Anzahl für jede Datei so beibehalten, indem ich die statischen Dateien in eine andere Subdomain lege und dann Apache das Heavy Lifting mache, ist nicht so gut, wie HttpResponseRedirecting den Benutzer zu einer Subdomain ist nicht gut Denn dann sieht der Benutzer die richtige Download-URL und kann die Datei daher herunterladen, ohne die Download-Anzahl zu erhöhen. Ich könnte einfach eine Ansicht erstellen, die dann dient() s die Datei, aber ich bin besorgt darüber "big fat disclaimer". Wie würdest/hättest du das umgesetzt? Ich bin mir ziemlich sicher, dass ich nicht der einzige mit diesem Problem bin.Serving statische Dateien mit Logik in Django (halten eine Downloadcount)

Über die Plattform: Ich benutze Apache und mod_wsgi.

Danke

Antwort

1

psjs Antwort ist definitiv eine praktikable Option. Eine andere Option, die Sie untersuchen sollten, ist das Setzen eines Reverse-Proxy-Servers vor Apache wie Perlbal, der "X-REPROXY-URL" -Kopfzeilen unterstützt.

Sobald Sie den Reverse-Proxy-Server installiert haben, können Sie anstelle einer Weiterleitungsantwort des Benutzers eine Antwort mit dem Header "X-REPROXY-URL" an eine URL senden, auf die der Proxy-Server aber zugreifen kann der Benutzer kann nicht. Der Proxy-Server liest dann die Datei von dem Ort ein, den Sie in der Kopfzeile gesendet haben, und übergibt ihn dann an Ihren Client. Sie tun dies auf eine effiziente Weise und da alle Ihre Django-App-Server senden müssen, ist eine Antwort mit einem Header-Satz, es ist frei, eine andere Anfrage zu behandeln.

0

Ich tat dies mit django-Zähler nicht zu lange her. Damit behalten Sie die Anzahl der Zähler im Admin im Auge.

+0

Ich habe auf eine allgemeinere Antwort gehofft, da das Halten einer Downloadzählung nicht die einzige Logik ist, die weitergeht :) – niklasfi

5

Wir haben ein System implementiert, bei dem wir den Download-Zugriff auf (große) statische Dateien kontrollieren mussten, da Django natürlich nicht selbst bedient werden sollte. Wir haben ein Schema entwickelt, mit dem die Django-App nach der Bestätigung, dass der Benutzer die Datei herunterladen konnte (oder in Ihrem Fall einen Zähler erhöht), einen zufälligen Symlink zu der Datei erstellen würde, auf die Apache Zugriff hatte (Seien Sie vorsichtig: Stellen Sie sicher, dass die Verzeichnisindizierung deaktiviert ist usw.) und leiten Sie den Benutzer dann an den Symlink weiter, der von Apache bedient werden soll.

Wir haben einen "Cleanup" -Cronjob, der Symlink eine Minute nach ihrer Erstellung aufräumt, also wenn sie es erneut herunterladen wollen, müssen sie durch Django gehen und es erneut zählen lassen. Nun, theoretisch könnten sie es in dieser Zeit mehr als einmal herunterladen, aber wird das wahrscheinlich passieren? Du könntest mehr als jede Minute aufräumen: Apache benötigt nur den Symlink, um zu Beginn des Downloads zu existieren, nicht während der ganzen Sache.

Ich wäre neugierig zu wissen, wie andere dieses Problem angehen, da ich dem OP zustimme, dass es ein übliches Szenario ist.

+0

das klingt nach einer guten Idee, aber ich möchte anständiges URL-Design behalten und den Benutzer zum Download freigeben eine Datei zweimal von der gleichen Stelle – niklasfi

+0

Sicher, aber dieses Modell unterstützt das noch. Die kanonische URL für die Datei ist die von Django gesteuerte URL, die konsistent und anständig ist, und die einzige URL, die der Benutzer sieht. Die Umleitung zu dem von Apache unterstützten Symlink ist eher ein "Klempner-Detail", das der Benutzer nicht bemerkt - der Browser folgt der Umleitung transparent. – psj