Creare dinamicamente le miniature delle immagini (Django)
-
21-09-2019 - |
Domanda
Vorrei creare dinamicamente le miniature in base ai parametri nell'URL. Ad esempio, http://mysite.com/images/1234/120x45.jpg
creerebbe una miniatura 120x45
per un'immagine ID 1234
.
La soluzione ovvia a questo è di avere una visione Django che esegue le seguenti:
- Cercare una versione precedentemente memorizzata nella cache delle immagini in questa dimensione.
- Creare una miniatura se non è memorizzato nella cache (una certa logica per il blocco in modo che solo 1 processo crea la miniatura e altri processi attendere).
- Tubo i risultati attraverso Django.
Questo dovrebbe "lavoro", ma sono preoccupato per le prestazioni. Non mi piace l'idea di usare Django per servire contenuti statici. Quali sono alcuni altri modi per ottenere questo problema?
Soluzione
Non è necessario usare Django per servire direttamente il contenuto statico. Basta avere il vostro percorso server di 404 richieste per le vostre immagini cartella a una visualizzazione Django, dove si divide a parte il nome del file e genera la miniatura del caso, prima di reindirizzare all'URL originale (che si spera non sarà più un 404).
Per quanto riguarda il suggerimento django-imagekit dell'altra risposta, io non sono sicuro che lo fa di tutto per farvi in modo dinamico generare pollici di immagini basate su URL, ma certamente vi consiglio di utilizzarlo per tutte le caratteristiche che deve avere.
Modifica
Per quanto riguarda la struttura degli URL attuale, mi sento un /images/filename-120x45.jpg
più tipico permetterebbe di filtrare più facilmente fuori 404 richieste che non hanno nulla a che fare con la generazione delle miniature dinamica. Diciamo, per esempio, che ci sono tonnellate di 404 errori per /images/original_size_image.jpg
. Lei non vorrebbe coloro che vengono instradati a Django, e si può abbinare solo i nomi di file di questo formato con espressioni regolari. [modifica fine]
Bisogna stare attenti però di lasciare qualcuno a conoscenza di questa funzione di spam tua app Django. Essi potrebbero potenzialmente ucciderlo con un numero infinito di combinazioni di dimensioni delle immagini e nomi di file a portata di mano. Si avrebbe bisogno di capire come mettere limiti superiori su queste richieste, come il reindirizzamento di nuovo ad un 404 se uno dei due dimensione è più grande dell'originale, o anche capire come cap richieste di dimensioni multiple della stessa immagine. Forse questo era quello che vuoi arrivare quando si citano "blocco", anche se.
Per inciso, vedo che hai codificato Apache, ma mi piacerebbe davvero raccomandare che si servono contenuti statici attraverso qualcosa di simile Nginx . Si potrebbe forse negare il sovraccarico delle richieste di immagini dinamiche, se si utilizza un file server statico che non è completa schifezza a servire i file statici.
Altri suggerimenti
Vedere questa applicazione per generare pollici.
Sviluppato in Python, utilizzando server di tornadoweb.
https://github.com/globocom/thumbor
pip install thumbor
Gran Application
Scopri Django imagekit. http://bitbucket.org/jdriscoll/django-imagekit/wiki/Home
Ho guardato queste risposte e, anche se lavoro che stavano semplicemente troppo sofisticate per me. Se si desidera solo un modo rapido e sporco per ottenere le miniature, usando solo la libreria PIL potrebbe essere una buona chiamata, questo è il mio codice:
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)
Scarica la libreria PIL qui
Saluti, spera che questo aiuta qualcuno.
È possibile dare uno sguardo a il SORL-thumbnail documentazione . Io lo uso in quasi tutti i miei progetti insieme a servire contenuti statici con Nginx dalla dir /media/
:)
Guarda discussione su contributo delle miniature per Django:
Ho avuto lo stesso problema esatto: in un sito ad alto traffico, generando decine di miniature al tempo di risposta non è fattibile, come sta generando miniature per tutti i contenuti passato, in batch, in modo ho creato un app per questo. Check it out: https://github.com/hcarvalhoalves/django-rest-thumbnails
Thumbor è davvero un grande servizio, è possibile utilizzare django-thumbor su Django.
pip install django-thumbor
Repo qui: https://github.com/ricobl/django-thumbor
Si può solo bisogno di ridimensionare l'immagine sullo schermo, in base alla dimensione specificata è necessario, su richiesta. La biblioteca Django Imagefit fa esattamente questo, e dà anche la possibilità di ritagliare.
Nel tuo esempio si può scrivere {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }}
e si finirebbe un'immagine di 120x45 dimensioni con.