Sorl-thumbnail: Sirviendo archivos estáticos

Creado en 20 sept. 2011  ·  3Comentarios  ·  Fuente: jazzband/sorl-thumbnail

No puedo encontrar ninguna forma de hacer una miniatura de un archivo estático (en STATIC_ROOT). Parece que solo funciona en archivos externos (http://....) y multimedia (en MEDIA_ROOT).

Esto es muy útil cuando el tamaño de salida de una imagen estática no siempre es el mismo (ya sea por las preferencias del usuario, la temática, etc.)

Comentario más útil

Aquí hay un ejemplo de un parche https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

EDITAR : lo siento, parece que la salida de thumbnail.url es válida, pero cuando se recupera de cached.url tiene el prefijo /media/ en lugar de /static/ . Hay algo más roto por dentro.

EDITAR (2) : hay un problema de diseño al deserializar el código de almacenamiento: la clase de almacenamiento se carga y se crea una instancia con los valores predeterminados en lugar de usar la instancia existente. En otras palabras, sorl.thumbnail no reutiliza la instancia de almacenamiento sino que crea una propia (configurada de manera diferente). Como solución, podemos heredar de FileSystemStorage y definir un inicializador personalizado.

Después de aplicarlo, cualquiera puede generar fácilmente miniaturas para cualquier cosa.
Es posible crear una etiqueta de plantilla personalizada como esta:

from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django import template
from sorl.thumbnail.templatetags.thumbnail import ThumbnailNode


register = template.Library()

class StaticThumbnailStorage(FileSystemStorage):
    def __init__(self, *args, **kw):
        super(StaticThumbnailStorage, self).__init__(
            *args, location='/path/to/custom/static/'
            base_url=settings.STATIC_URL, **kw)

storage = StaticThumbnaikStorage()

class StaticThumbnailNode(ThumbnailNode):
    def _get_thumbnail(self, file_, geometry, **options):
        options['storage'] = storage
        return super(StaticThumbnailNode, self)._get_thumbnail(
                file_, geometry, **options)


@register.tag
def static_thumbnail(parser, token):
    return StaticThumbnailNode(parser, token)

Tenga en cuenta que no es necesario cambiar la configuración.

Todos 3 comentarios

Debe usar algún almacenamiento que use STATIC_ROOT, por ejemplo, puede usar 'django.core.files.storage.FileSystemStorage' e instanciar con location=settings.STATIC_ROOT y base_url=settings.STATIC_URL, continúe en stackoverflow ya que esto no es un bicho.

Después de cinco años, todavía no existe la posibilidad de generar miniaturas a partir de archivos estáticos sin cambiar el almacenamiento PREDETERMINADO, debido a https://github.com/mariocesar/sorl-thumbnail/blob/master/sorl/thumbnail/base.py#L100
StackOverflow no ayudará debido a la implementación.

¿Alguna posibilidad de ARREGLAR eso? Pasar una instancia de almacenamiento personalizado a través get_thumbnail() será suficiente.

Aquí hay un ejemplo de un parche https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

EDITAR : lo siento, parece que la salida de thumbnail.url es válida, pero cuando se recupera de cached.url tiene el prefijo /media/ en lugar de /static/ . Hay algo más roto por dentro.

EDITAR (2) : hay un problema de diseño al deserializar el código de almacenamiento: la clase de almacenamiento se carga y se crea una instancia con los valores predeterminados en lugar de usar la instancia existente. En otras palabras, sorl.thumbnail no reutiliza la instancia de almacenamiento sino que crea una propia (configurada de manera diferente). Como solución, podemos heredar de FileSystemStorage y definir un inicializador personalizado.

Después de aplicarlo, cualquiera puede generar fácilmente miniaturas para cualquier cosa.
Es posible crear una etiqueta de plantilla personalizada como esta:

from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django import template
from sorl.thumbnail.templatetags.thumbnail import ThumbnailNode


register = template.Library()

class StaticThumbnailStorage(FileSystemStorage):
    def __init__(self, *args, **kw):
        super(StaticThumbnailStorage, self).__init__(
            *args, location='/path/to/custom/static/'
            base_url=settings.STATIC_URL, **kw)

storage = StaticThumbnaikStorage()

class StaticThumbnailNode(ThumbnailNode):
    def _get_thumbnail(self, file_, geometry, **options):
        options['storage'] = storage
        return super(StaticThumbnailNode, self)._get_thumbnail(
                file_, geometry, **options)


@register.tag
def static_thumbnail(parser, token):
    return StaticThumbnailNode(parser, token)

Tenga en cuenta que no es necesario cambiar la configuración.

¿Fue útil esta página
0 / 5 - 0 calificaciones