Pregunta

Me gustaría crear dinámicamente las miniaturas basado en parámetros en la URL.Por ejemplo, http://mysite.com/images/1234/120x45.jpg iba a crear un 120x45 la miniatura de la imagen de id de 1234.

La solución obvia a este problema es tener una django ver que hace lo siguiente:

  1. Busca una previamente versión en caché de la imagen de este tamaño.
  2. Crear una miniatura, si no en caché (algunos lógica de bloqueo de modo que sólo 1 proceso crea la imagen en miniatura y otros procesos de esperar).
  3. Tubería de los resultados a través de django.

Que debe "trabajar", pero yo estoy preocupado por 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?

¿Fue útil?

Solución

Usted no tiene que usar Django para servir el contenido estático directamente.Simplemente, que su servidor de ruta 404 solicitudes para su carpeta de imágenes a una Django vista, donde se divide aparte el nombre del archivo y genera la miniatura adecuada, antes de redireccionar la espalda a la URL original (que esperemos que no sea una 404).

Como para la otra respuesta es django-imagekit sugerencia, no estoy seguro de que no hace nada para hacerle dinámicamente generar imagen de los pulgares en función de la URL, pero sin duda, lo hago se recomienda su uso para todas las características que tiene.

Editar:

En cuanto a la verdadera estructura de la URL, me siento más típico /images/filename-120x45.jpg permitiría más fácilmente filtrar 404 solicitudes que no tienen nada que ver con la dinámica de generación de imágenes en miniatura.Decir, por ejemplo, que hay un montón de errores 404 para /images/original_size_image.jpg.Usted no quiere que aquellos que se enruten a Django, y usted podría sólo coincidirá con los nombres de los archivos de ese formato, con regex. [fin de editar]

Tienes que ser cuidadoso acerca de dejar a nadie consciente de esta característica de spam de su aplicación de Django.Podría matar con un número infinito de tamaño de la imagen y el nombre de archivo combinaciones al alcance de su mano.Usted necesita entender cómo poner límites a estas solicitudes, como redirigir de nuevo a un 404 si la dimensión es mayor que el original, o incluso averiguar cómo la tapa de las solicitudes de múltiples dimensiones de la misma imagen.Tal vez esto era lo que estabas llegar al mencionar el "bloqueo" a pesar de.

Como un aparte, veo que has etiquetado de Apache pero realmente me gustaría recomendar que usted sirve contenido estático a través de algo como Nginx.Usted tal vez podría negar la sobrecarga adicional de la imagen dinámica de las solicitudes de si utiliza un archivo estático servidor que no está completa mierda en servir los archivos estáticos.

Otros consejos

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

Vea esta aplicación para generar pulgares.

Desarrollado en Python, utilizando el servidor Tornadoweb.

https://github.com/globocom/thumbor

pip install thumbor

Gran aplicación

Busqué estas respuestas y, aunque funcionan, eran demasiado sofisticados para mí. Si solo desea una forma rápida y sucia de obtener miniaturas, solo usar la biblioteca PIL podría ser una buena llamada, este 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)

Descargar la biblioteca PIL aquí

Saludos, espera que esto ayude a alguien.

Puedes echar un vistazo a la documentación de Sorl-Thumbnail. Lo uso en casi todos mis proyectos junto con el contenido estático con Nginx del /media/ Dir :)

Consulte esta página de discusión sobre la contribución de miniatura para Django:

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

Tenía el mismo problema exacto: en un sitio de alto tráfico, no es factible generar docenas de miniaturas en el tiempo de respuesta, al igual que las miniaturas para todo el contenido pasado en lotes, por lo que creé una aplicación para eso. Échale un vistazo: https://github.com/hcarvalhoalves/django-rest-thumbnails

Thumbor, de hecho, es un gran servicio, puede usar Django-Thumbor en Django.

pip install django-thumbor

Repo aquí:https://github.com/ricobl/django-thumbor

Es posible que solo necesite cambiar el tamaño de la imagen en la pantalla, según la dimensión especificada que necesita, bajo demanda. los Django ImageFit La biblioteca hace exactamente eso, y también da la posibilidad de recortar.

En tu ejemplo escribirías {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }} Y terminarías con una imagen de tamaño de 120x45.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top