Dynamische Erstellung von Miniaturbildern (mit Django)

8

Ich möchte Thumbnails dynamisch anhand von Parametern in der URL erstellen. Zum Beispiel würde http://mysite.com/images/1234/120x45.jpg ein 120x45 thumbnail für die Bild-ID 1234 erstellen.

Die offensichtliche Lösung hierfür ist eine Django-Ansicht, die folgendes bewirkt:

  1. Suchen Sie nach einer zuvor im Cache gespeicherten Version des Bildes in dieser Größe.
  2. Erstellen Sie ein Vorschaubild, wenn es nicht im Cache gespeichert ist (eine Logik zum Sperren, sodass nur ein Prozess das Miniaturbild erstellt und andere Prozesse warten).
  3. Verteile die Ergebnisse durch django.

Das sollte "funktionieren", aber ich bin besorgt über die Leistung. Ich mag die Idee nicht, Django zu verwenden, um statischen Inhalt zu dienen. Was sind andere Möglichkeiten, um dieses Problem zu lösen?

    
Gattster 21.01.2010, 02:26
quelle

10 Antworten

8

Sie müssen Django nicht verwenden, um den statischen Inhalt direkt zu liefern. Lassen Sie Ihren Server 404-Anforderungen für Ihren Bilderordner einfach an eine Django-Ansicht weiterleiten, wo er den Dateinamen aufteilt und die entsprechende Miniaturansicht generiert, bevor er zur ursprünglichen URL zurückgeleitet wird (die hoffentlich kein 404 mehr ist).

Was den Django-Imagekit-Vorschlag der anderen Antwort anbelangt, bin ich nicht sicher, ob Sie dynamisch Image-Thumbs basierend auf URL generieren können, aber ich empfehle es für alle Features es hat.

Bearbeiten:

Was die eigentliche URL-Struktur anbelangt, glaube ich, dass ein typischeres /images/filename-120x45.jpg es Ihnen ermöglichen würde, 404 Anfragen, die nichts mit dynamischer Thumbnail-Erzeugung zu tun haben, leichter herauszufiltern. Nehmen wir zum Beispiel an, dass es für /images/original_size_image.jpg Tonnen von 404 Fehlern gibt. Sie möchten nicht, dass diese nach Django geroutet werden, und Sie könnten nur Dateinamen dieses Formats mit Regex abgleichen. [Ende bearbeiten]

Sie müssen jedoch vorsichtig sein, wenn Sie jemanden über diese Funktion informieren, um Ihre Django-App zu spammen. Sie könnten es mit einer unendlichen Anzahl von Bildgrößen- und Dateinamen-Kombinationen an ihren Fingerspitzen töten. Sie müssten überlegen, wie Sie diese Anfragen mit Obergrenzen versehen können, z. B. das Zurückleiten zu einer 404, wenn eine Dimension größer als das Original ist, oder sogar das Ermitteln, wie Anforderungen für mehrere Dimensionen des gleichen Bildes begrenzt werden. Vielleicht warst du das, worauf du hinauskamst, als du "Sperren" erwähnst.

Nebenbei bemerkt, Sie haben Apache getaggt, aber ich würde Ihnen wirklich empfehlen, dass Sie statische Inhalte über so etwas wie Nginx . Sie könnten den zusätzlichen Overhead der dynamischen Image-Anforderungen möglicherweise negieren, wenn Sie einen statischen Dateiserver verwenden, der bei der Bereitstellung statischer Dateien kein kompletter Mist ist.

    
jonwd7 21.01.2010, 02:58
quelle
4

Sie können sorl auch ausprobieren, es wird von Satchmo .

    
Joshua Partogi 21.01.2010 02:54
quelle
4

Sehen Sie sich diese Anwendung an, um Daumen zu generieren.

Entwickelt in Python mit dem tornadoweb Server.

Ссылка

%Vor%

Großartige Anwendung

    
Cícero Verneck Corrêa 03.08.2012 22:38
quelle
2

Schau dir django imagekit an. Ссылка

    
ablerman 21.01.2010 02:39
quelle
2

Ich habe diese Antworten nachgeschlagen und obwohl sie funktionieren, waren sie für mich zu einfach. Wenn Sie nur eine schnelle und schmutzige Möglichkeit haben möchten, Thumbnails zu erhalten, ist die Verwendung der PIL-Bibliothek möglicherweise ein guter Aufruf, das ist mein Code:

%Vor%

Laden Sie die PIL-Bibliothek hier herunter

Prost, hofft das hilft jemandem.

    
thyagx 01.02.2012 21:05
quelle
2

Sie können einen Blick auf die Sorl-Miniaturansicht werfen. Ich verwende es in fast allen meinen Projekten zusammen mit der Bereitstellung von statischem Inhalt mit Nginx aus dem /media/ dir:)

    
Michał Ludwiński 27.01.2010 04:58
quelle
0

Schau dir diese Diskussionsseite über den Thumbnail-Beitrag für Django an:

Ссылка

    
BigJ 11.07.2012 10:08
quelle
0

Ich hatte genau das gleiche Problem: Auf einer Website mit hohem Besucheraufkommen ist es nicht möglich, dutzende Thumbnails zur Reaktionszeit zu erstellen, ebenso wie Thumbnails für alle bisherigen Inhalte im Stapel, also habe ich eine App dafür erstellt. Schau es dir an: Ссылка

    
hcalves 29.10.2012 20:42
quelle
0

Thumbor ist wirklich ein großartiger Dienst, du kannst django-thumbor auf Django benutzen.

%Vor%

Repo hier: Ссылка

    
ricobl 10.05.2013 02:25
quelle
0

Sie müssen das Bild auf der Grundlage der angegebenen Dimension, die Sie benötigen, nur bei Bedarf anpassen. Die Django Imagefit Bibliothek tut genau das, und sie bietet auch die Möglichkeit zu beschneiden.

In Ihrem Beispiel würden Sie {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }} schreiben und Sie würden mit einem Bild der Größe 120x45 enden.

    
vinyll 27.03.2018 08:40
quelle

Tags und Links