Wie speichern Sie Bilddateien in Django?

9

Was ist das typische Szenario zum Speichern von Bilddateien in Django? Genauer gesagt, werden Bilder direkt in einem Datenbank-Blob (z. B. MongoDB GridFS), auf einem lokalen Dateisystem oder in Amazon S3 gespeichert? Für alle drei Fälle gibt es Werkzeuge oder Django-Pakete, die dein Leben mit der Speicherung von Bildern vereinfachen?

Ich speichere derzeit Bilder im Ordner media im Django-Projekt auf einem lokalen Entwicklungsserver. Jemand hat mir gesagt, dass es eine schlechte Übung ist, statische Dateien auf demselben Rechner zu verwenden. Was ist also ein typisches Szenario für das Speichern und Servieren statischer Bilder in Django?

    
Sahat Yalkabov 02.05.2012, 05:30
quelle

4 Antworten

9

Ein typisches Beispiel aus der Praxis wäre, hochgeladene Bilder in einem Unterverzeichnis des media/ -Verzeichnisses Ihrer Site zu speichern:)

Dies kann zu einem Problem werden, wenn Sie mehr Bilder speichern müssen, als der App-Server über Festplattenspeicher verfügt, oder wenn Sie mehr als einen App-Server benötigen oder wenn Sie ein CDN verwenden möchten, um die Latenz zu verringern tausend andere Dinge.

Aber wenn Sie keine spezifischen Anforderungen für die ersten Schritte haben, ist die einzige Möglichkeit zu wissen, welche (wenn überhaupt) dieser tausend Dinge, um die Sie sich kümmern müssen, der Start Ihrer Website und der schnellste Weg dazu ist Das heißt, Bilder in einem Unterverzeichnis von media/ zu speichern.

Wenn Sie dies mit FileField tun und vorsichtig in Ihrem Code sind, z. B. nicht davon auszugehen, dass das Bild eine Datei auf Ihrer lokalen Festplatte ist (z. B. tun Verwenden Sie die .url() -Methode von FileFile und Sie nicht verwenden die .path -Eigenschaft, es wird einfach sein, diese Bilder auf ein geeigneteres Backend zu verschieben, wenn (und falls) die Zeit kommt.

    
David Wolever 02.05.2012, 05:45
quelle
4

Standardmäßig speichert Django alle Ihre Dateien (und Bilder) im MEDIA_ROOT . Sie können jedoch einen benutzerdefinierten Dateispeicher schreiben, um ihn an anderen Orten zu speichern .

Was soll ich wählen? Es kommt wirklich darauf an.
Wie viele Dateien möchten Sie speichern? Wie viel Speicherplatz werden sie verwenden? Wie viel Bandbreite? Glauben Sie, dass es Spitzen von sehr hohem Gebrauch geben wird?

Normalerweise ist das lokale Dateisystem die schnellste Option. Wenn Sie jedoch feststellen, dass diese Bilder zu viel Bandbreite beanspruchen, sollten Sie sie möglicherweise auslagern, insbesondere wenn das Nutzungsmuster hohe Spitzenwerte aufweist. Umgekehrt, wenn Sie auf mehrere Server skalieren müssen, kann es nützlich sein, sie in eine Datenbank zu verschieben.

Wie auch immer, Sie sollten sich erst entscheiden, nachdem Sie einige Daten erhalten haben, wenn möglich echte Daten. Das Wechseln zu einem anderen Speichersystem ist ziemlich einfach, also würde ich mit dem lokalen Dateisystem beginnen und dann zu etwas Züchter wechseln, nur nachdem ich Probleme gesehen habe.

    
Roberto Liffredo 02.05.2012 06:23
quelle
3

Es ist keine schlechte Übung, per se . Ich denke, wer auch immer dir das gesagt hat, ist ein wenig verwirrt. Django sagt, du solltest niemals statische Ressourcen mit Django bereitstellen, dh sie sollten direkt von dem Webserver bedient werden, den du als Reverse Proxy für Django verwendest (Apache, nginx, etc.), aber nein Streit darüber, ob das auf einem anderen Server oder auf dem gleichen Server sein muss.

Wenn Sie eine einfache App oder Website haben, ist die Verwendung eines völlig anderen Servers für statische Dateien wahrscheinlich übertrieben. Es ist nur in Fällen von hoher Nebenläufigkeit wichtig (denken Sie an Twitter, Facebook usw.), wo die Anwendung es sich nicht leisten kann, dass sich der Webserver um irgendetwas kümmert, außer um Anfragen an die App selbst zu befördern. Jetzt bieten einige Web-Hosts "Cloud" -Speicher, um mit Ihrem VPS (Rackspace, zum Beispiel) zu gehen. Wenn du einen solchen Host verwendest, nutze alles, was du hast, aber das ist meistens nicht nötig.

Allerdings ist ein Vorteil beim Bereitstellen von statischen Ressourcen unter einer anderen Subdomäne . Sie können den gleichen Server verwenden, aber durch die Verwendung einer Subdomain (zB static.mysite.com) können Browser in einigen Fällen mehr parallele Downloads durchführen und zumindest verhindern, dass Cookies von der Hauptwebseite an jede statische Datei angehängt werden Anfrage.

    
Chris Pratt 02.05.2012 14:43
quelle
1

Es hängt wirklich von der Lösung ab, die Sie lösen möchten. Es gibt Fälle, in denen s3 eine viel bessere Lösung als lokaler Dateispeicher sein kann. s3 bietet mehr Flexibilität in Bezug auf den Zugriff auf die Daten von verschiedenen Web-Apps und die Entkopplung von dem verwendeten Server. Ich denke, S3 ist eine Route, wenn Sie viele Bilder verwenden möchten. Wenn Sie glauben, dass eine begrenzte Anzahl von Bildern verwendet wird, dann wäre lokaler Speicher auf dem Server eine gute Implementierung (denke ich).

In Bezug auf Tools, die Sie verwenden können, würde ich in PIL schauen. Ссылка

    
locoboy 02.05.2012 07:54
quelle

Tags und Links