2010-01-21 17 views
8

Me gustaría crear miniaturas dinámicamente según los parámetros en la URL. Por ejemplo, http://mysite.com/images/1234/120x45.jpg crearía una miniatura de 120x45 para la identificación de imagen 1234.Crear imágenes en miniatura de forma dinámica (usando django)

La solución obvia para esto es tener una vista de Django, que hace lo siguiente:

  1. Busque una versión previamente en caché de la imagen en este tamaño.
  2. Cree una miniatura si no está en caché (alguna lógica para el bloqueo, de modo que solo 1 proceso crea la miniatura y otros procesos esperan).
  3. Transmita los resultados a través de django.

Eso debería "funcionar", pero me preocupa el rendimiento. No me gusta la idea de usar django para servir contenido estático. ¿Cuáles son algunas otras maneras de lograr este problema?

+0

Si va a crear dinámicamente la uña del pulgar, a continuación, en realidad no es estática, es? –

+0

Lo veo como una miniatura estática cargada de pereza. Una vez que se haya creado, me gustaría el mismo rendimiento que si fuera estático. – Gattster

Respuesta

8

No tiene que usar Django para servir el contenido estático directamente. Simplemente haga que su servidor enrute las solicitudes 404 para su carpeta de imágenes a una vista de Django, donde separa el nombre del archivo y genera la miniatura adecuada, antes de redirigir de nuevo a la URL original (que con suerte ya no será un 404).

En cuanto a la sugerencia django-imagekit de la otra respuesta, no estoy seguro de que lo hace nada para que pueda dinámicamente generar los pulgares de imagen basados ​​en URL, pero sin duda recomendamos usarla para todas las funciones que sí tiene.

Editar:

En cuanto a la estructura de la URL real, me siento una más típica /images/filename-120x45.jpg le permitirá filtrar más fácilmente a cabo 404 solicitudes que no tienen nada que ver con la generación de miniaturas dinámico. Digamos, por ejemplo, que hay toneladas de errores 404 para /images/original_size_image.jpg. No querría que los enrutaran a Django, y solo podría hacer coincidir los nombres de archivo de ese formato con expresiones regulares. [fin de editar]

Sin embargo, debe tener cuidado al permitir que nadie sepa de esta característica el correo no deseado en su aplicación Django. Podrían matarlo con un número infinito de combinaciones de tamaño de imagen y nombre de archivo en la punta de sus dedos. Tendría que averiguar cómo poner límites máximos a estas solicitudes, como redireccionar a un 404 si cualquiera de las dimensiones es más grande que el original, o incluso averiguar cómo limitar las solicitudes de múltiples dimensiones de la misma imagen. Quizás esto era a lo que estabas llegando cuando mencionaste "bloqueo".

Como acompañamiento, veo que has etiquetado a Apache, pero realmente me gustaría recomendar que sirvas contenido estático a través de algo como Nginx. Tal vez podría negar la sobrecarga adicional de las solicitudes de imágenes dinámicas si usa un servidor de archivos estático que no es completo en el servicio de archivos estáticos.

+0

Gran respuesta. Una solución al problema del correo no deseado es tener una lista predefinida de tamaños de imágenes/miniaturas permitidas. Además, estoy de acuerdo en nginx. Estoy usando nginx para servir contenido estático actualmente y agregaré la etiqueta nginx a esta pregunta. – Gattster

+0

Ah, sí ... pero no estaba seguro de cuán "dinámica" sería para ti una lista predefinida de tamaños permitidos, así que no lo mencioné. Tampoco estaba seguro de sus formatos de imagen y si son proporciones estándar o consistentes, o si planeaba recortar el pulgar si no se ajustaba a un tamaño predefinido, etc., etc. Además, voy a editar mi respuesta momentáneamente para agregar algo sobre el formato de URL que discute. – jonwd7

+0

Estoy usando una botella para esto pero funcionó usando el mismo principio. Es genial que funcione de esta manera. –

4

También puedes probar sorl, está siendo utilizado por Satchmo.

2

Puede echar un vistazo al the sorl-thumbnail documentation.Yo lo uso en casi todos mis proyectos, junto con servir contenido estático con Nginx del /media/ dir :)

2

Miré estas respuestas ya pesar de que trabajo que estaban demasiado sofisticado para mí. Si lo que desea es una manera rápida y sucia para obtener imágenes en miniatura, simplemente usando la biblioteca PIL podría ser una buena llamada, esta es mi código:

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) 

Descarga la biblioteca PIL here

Cheers, espera que esta ayuda a alguien

0

Mira lo que la discusión sobre la contribución miniatura de Django:

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

+0

Las respuestas que solo contienen enlaces son [consideradas malas prácticas] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Resuma el contenido aquí (no copie/pegue) para que la respuesta pueda ser independiente. Si no lo hace, corre el riesgo de que su respuesta sea eliminada, especialmente si el enlace alguna vez muere. –

4

Ver esta aplicación para generar los pulgares.

Desarrollado en Python, utilizando el servidor tornadoweb.

https://github.com/globocom/thumbor

pip install thumbor 

gran aplicación

+0

Thumbor hace todo lo que el OP quiere. –

0

que tenía exactamente el mismo problema: en un sitio de alto tráfico, generando decenas de miniaturas en el tiempo de respuesta no es factible, ya que es la generación de imágenes en miniatura para todos los anteriores contenido en lote, así que creé una aplicación para eso. Verifique: https://github.com/hcarvalhoalves/django-rest-thumbnails

Cuestiones relacionadas