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:

  1. Suchen Sie nach einer zuvor zwischengespeicherten Version des Bildes in dieser Größe.
  2. 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).
  3. 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?

War es hilfreich?

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

Sie können es auch versuchen Sorl, es wird von benutzt von Satchmo.

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:

https://code.djangoproject.com/wiki/thumbnails

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top