Sorl-thumbnail: Servindo arquivos estáticos

Criado em 20 set. 2011  ·  3Comentários  ·  Fonte: jazzband/sorl-thumbnail

Não consigo encontrar nenhuma maneira de miniatura de um arquivo estático (em STATIC_ROOT). Parece funcionar apenas em arquivos externos (http://....) e de mídia (em MEDIA_ROOT).

Isso é muito útil quando o tamanho de saída de uma imagem estática nem sempre é o mesmo (seja pelas preferências do usuário, temas, etc.)

Comentários muito úteis

Aqui está um exemplo de um patch https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

EDIT : desculpe, parece que a saída de thumbnail.url é válida, mas quando recuperada de cached.url é prefixada com /media/ em vez de /static/ . Há algo mais quebrado por dentro.

EDIT (2) : há um problema de design na desserialização do código de armazenamento - a classe de armazenamento é carregada e instanciada com padrões em vez de usar a instância existente. Em outras palavras - sorl.thumbnail não reutiliza a instância de armazenamento, mas cria a própria (configurada de maneira diferente). Como solução alternativa, podemos herdar do FileSystemStorage e definir o inicializador personalizado.

Depois de aplicá-lo, qualquer pessoa pode facilmente gerar miniaturas para qualquer coisa.
É possível criar uma tag de modelo 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)

Observe que as configurações não precisam ser alteradas.

Todos 3 comentários

Você precisa usar algum armazenamento que use STATIC_ROOT, por exemplo, você pode usar 'django.core.files.storage.FileSystemStorage' e instanciar com location=settings.STATIC_ROOT e base_url=settings.STATIC_URL, por favor continue no stackoverflow, pois isso não é um erro.

Após cinco anos ainda não há possibilidade de gerar thumbs de arquivos estáticos sem alterar o armazenamento DEFAULT, por causa de https://github.com/mariocesar/sorl-thumbnail/blob/master/sorl/thumbnail/base.py#L100
StackOverflow não ajudará devido à implementação.

Alguma chance de CORRIGIR isso? Passar a instância de armazenamento personalizada via get_thumbnail() será suficiente.

Aqui está um exemplo de um patch https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

EDIT : desculpe, parece que a saída de thumbnail.url é válida, mas quando recuperada de cached.url é prefixada com /media/ em vez de /static/ . Há algo mais quebrado por dentro.

EDIT (2) : há um problema de design na desserialização do código de armazenamento - a classe de armazenamento é carregada e instanciada com padrões em vez de usar a instância existente. Em outras palavras - sorl.thumbnail não reutiliza a instância de armazenamento, mas cria a própria (configurada de maneira diferente). Como solução alternativa, podemos herdar do FileSystemStorage e definir o inicializador personalizado.

Depois de aplicá-lo, qualquer pessoa pode facilmente gerar miniaturas para qualquer coisa.
É possível criar uma tag de modelo 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)

Observe que as configurações não precisam ser alteradas.

Esta página foi útil?
0 / 5 - 0 avaliações