Sorl-thumbnail: Servir des fichiers statiques

Créé le 20 sept. 2011  ·  3Commentaires  ·  Source: jazzband/sorl-thumbnail

Je ne trouve aucun moyen de vignetter un fichier statique (dans STATIC_ROOT). Il ne semble fonctionner que sur les fichiers externes (http://....) et multimédias (dans MEDIA_ROOT).

Ceci est très utile lorsque la taille de sortie d'une image statique n'est pas toujours la même (que ce soit par les préférences de l'utilisateur, le thème, etc.)

Commentaire le plus utile

Voici un exemple de patch https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

EDIT : désolé, il semble que la sortie de thumbnail.url soit valide, mais lorsqu'elle est récupérée à partir de cached.url , elle est préfixée par /media/ au lieu de /static/ . Il y a quelque chose de plus cassé à l'intérieur.

EDIT (2) : il y a un problème de conception dans la désérialisation du code de stockage - la classe de stockage est chargée et instanciée avec les valeurs par défaut au lieu d'utiliser l'instance existante. En d'autres termes - sorl.thumbnail ne réutilise pas l'instance de stockage mais crée sa propre instance (configurée différemment). Comme solution de contournement, nous pouvons hériter de FileSystemStorage et définir un initialiseur personnalisé.

Après l'avoir appliqué, n'importe qui peut facilement générer des vignettes pour n'importe quoi.
Il est possible de créer une balise de modèle personnalisée comme celle-ci :

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)

Veuillez noter qu'il n'est pas nécessaire de modifier les paramètres.

Tous les 3 commentaires

Vous devez utiliser un stockage qui utilise STATIC_ROOT, par exemple, vous pouvez utiliser 'django.core.files.storage.FileSystemStorage' et instancier avec location=settings.STATIC_ROOT et base_url=settings.STATIC_URL, veuillez continuer sur stackoverflow car ce n'est pas un punaise.

Après cinq ans, il n'y a toujours aucune possibilité de générer des vignettes à partir de fichiers statiques sans modifier le stockage DEFAULT, à cause de https://github.com/mariocesar/sorl-thumbnail/blob/master/sorl/thumbnail/base.py#L100
StackOverflow n'aidera pas en raison de la mise en œuvre.

Des chances de réparer ça ? Passer une instance de stockage personnalisée via get_thumbnail() suffira.

Voici un exemple de patch https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

EDIT : désolé, il semble que la sortie de thumbnail.url soit valide, mais lorsqu'elle est récupérée à partir de cached.url , elle est préfixée par /media/ au lieu de /static/ . Il y a quelque chose de plus cassé à l'intérieur.

EDIT (2) : il y a un problème de conception dans la désérialisation du code de stockage - la classe de stockage est chargée et instanciée avec les valeurs par défaut au lieu d'utiliser l'instance existante. En d'autres termes - sorl.thumbnail ne réutilise pas l'instance de stockage mais crée sa propre instance (configurée différemment). Comme solution de contournement, nous pouvons hériter de FileSystemStorage et définir un initialiseur personnalisé.

Après l'avoir appliqué, n'importe qui peut facilement générer des vignettes pour n'importe quoi.
Il est possible de créer une balise de modèle personnalisée comme celle-ci :

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)

Veuillez noter qu'il n'est pas nécessaire de modifier les paramètres.

Cette page vous a été utile?
0 / 5 - 0 notes