Erstellen Sie dynamisch Bildminiantien (mit Django)
-
21-09-2019 - |
Frage
Ich möchte dynamisch Miniaturansichten basierend auf Parametern in der URL erstellen. Zum Beispiel, http://mysite.com/images/1234/120x45.jpg
würde a erstellen 120x45
Miniaturansicht für Bild -ID 1234
.
Die offensichtliche Lösung dafür ist eine Django -Ansicht, die Folgendes ausmacht:
- Suchen Sie nach einer zuvor zwischengespeicherten Version des Bildes in dieser Größe.
- Erstellen Sie eine Miniaturansicht, wenn es nicht zwischengespeichert wird (eine Logik für das Sperren, so dass nur 1 Prozess das Miniaturbild und andere Prozesse warten).
- Die Ergebnisse durch Django leiten.
Das sollte "funktionieren", aber ich mache mir Sorgen um Leistung. Ich mag die Idee nicht, Django zu verwenden, um statischen Inhalten zu bedienen. Was sind einige andere Möglichkeiten, um dieses Problem zu lösen?
Lösung
Sie müssen Django nicht verwenden, um den statischen Inhalt direkt zu bedienen. Lassen Sie einfach Ihre Serverroute 404 -Anfragen für Ihren Bilderordner in eine Django -Ansicht, in der er den Dateinamen auseinander spaltet und das entsprechende Miniaturbild generiert, bevor er in die ursprüngliche URL zurückleitet (was hoffentlich nicht mehr 404 ist).
Ich bin mir nicht sicher, ob es etwas tut, um Sie zu lassen dynamisch Generieren Sie Bilddaumen basierend auf URL, aber ich empfehle sicherlich, sie für alle Funktionen zu verwenden, die es hat.
Bearbeiten:
Was die tatsächliche URL -Struktur betrifft, fühle ich mich typischer /images/filename-120x45.jpg
Würde Sie es Ihnen ermöglichen, 404 Anfragen leichter herauszufiltern, die nichts mit der dynamischen Miniaturgeneration zu tun haben. Sagen Sie zum Beispiel, dass es Tonnen von 404 Fehlern für gibt /images/original_size_image.jpg
. Sie würden nicht möchten, dass diejenigen nach Django weitergeleitet werden, und Sie könnten nur Dateinamen dieses Formats mit Regex übereinstimmen. Ende Edit
Sie müssen vorsichtig sein, wenn Sie jemanden über diese Funktion auf Ihre Django -App aufmerksam machen. Sie könnten es möglicherweise mit einer unendlichen Anzahl von Bildgröße und Dateinamenkombinationen an ihren Fingerspitzen töten. Sie müssten feststellen, wie Sie diesen Anfragen die oberen Grenzen setzen können, z. B. das Umleiten auf eine 404, wenn eine Dimension größer als das Original ist, oder sogar herauszufinden, wie Anforderungen für mehrere Dimensionen desselben Bildes gesteckt werden können. Vielleicht war das, was Sie waren, als Sie "Sperren" erwähnten.
Abgesehen davon, ich sehe, Sie haben Apache mit einem Tag mit dem Tag markiert, aber ich möchte wirklich empfehlen, dass Sie statische Inhalte durch so etwas wie möglich dienen Nginx. Möglicherweise können Sie den zusätzlichen Overhead der dynamischen Bildanforderungen zunichte machen, wenn Sie einen statischen Dateiserver verwenden, der bei der Bereitstellung statischer Dateien nicht vollständiger Mist verwendet.
Andere Tipps
Siehe diese Anwendung, um Daumen zu generieren.
Entwickelt in Python mit Tornadoweb Server.
https://github.com/globocom/thumbor
pip install thumbor
Tolle Anwendung
Schauen Sie sich Django ImageKit an.http://bitbucket.org/jdriscoll/django-imagekit/wiki/home
Ich habe diese Antworten nachgeschlagen und obwohl sie funktionieren, waren sie für mich einfach zu wundistisch. Wenn Sie nur einen schnellen und schmutzigen Weg möchten, um Miniaturansichten zu erhalten, ist dies ein guter Anruf, nur wenn Sie die PIL -Bibliothek verwenden, ist dies mein Code:
file, ext = os.path.splitext('image.jpg')
im = Image.open('/full/path/to/image.jpg')
im.thumbnail(size, Image.ANTIALIAS)
thumb_path = os.path.join('/full/path/to/thumb/dir/', file + ".thumb" + ".jpeg")
im.save(thumb_path)
Laden Sie die PIL -Bibliothek herunter hier
Prost, hofft, dass dies jemandem hilft.
Sie können einen Blick auf den Blick werfen Die Sorl-Dambnail-Dokumentation. Ich benutze es in fast allen meinen Projekten zusammen mit statischen Inhalten mit Nginx aus dem /media/
Dir :)
Schauen Sie sich diese Diskussionsseite über einen Miniaturansichtbeitrag für Django an:
Ich hatte das gleiche genaue Problem: In einer Seite mit hohem Verkehrsbetrieb ist es nicht möglich, Dutzende von Miniaturansichten zur Reaktionszeit zu generieren, ebenso wie das Generieren von Miniaturansichten für alle früheren Inhalte in der Stapel. Daher habe ich eine App dafür erstellt. Hör zu: https://github.com/hcarvalhoalves/django-rest-humbnails
Der Daumen ist in der Tat ein großartiger Service, Sie können Django-Thumbor auf Django verwenden.
pip install django-thumbor
Repo hier:https://github.com/ricobl/django-humbor
Möglicherweise müssen Sie die Größe des angezeigten Bildes auf der Grundlage der angegebenen Dimension bei Bedarf nur ändern. Das Django ImageFit Die Bibliothek macht genau das und bietet auch die Möglichkeit zu ernte.
In Ihrem Beispiel würden Sie schreiben {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }}
Und Sie würden mit einem Bild von 120 x 45 Größe enden.