Sorl-thumbnail: Обслуживание статических файлов

Созданный на 20 сент. 2011  ·  3Комментарии  ·  Источник: jazzband/sorl-thumbnail

Я не могу найти способ миниатюры статического (в STATIC_ROOT) файла. Кажется, он работает только с внешними (http://....) и мультимедийными (в MEDIA_ROOT) файлами.

Это очень полезно, когда выходной размер статического изображения не всегда одинаков (будь то из-за пользовательских настроек, тем и т. д.).

Самый полезный комментарий

Вот пример патча https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

РЕДАКТИРОВАТЬ : извините, кажется, что вывод из thumbnail.url действителен, но при извлечении из cached.url он имеет префикс /media/ вместо /static/ . Внутри еще что-то сломано.

РЕДАКТИРОВАТЬ (2) : существует проблема дизайна при десериализации кода хранилища - класс хранилища загружается и создается со значениями по умолчанию вместо использования существующего экземпляра. Другими словами - sorl.thumbnail не использует экземпляр хранилища повторно, а создает собственный (настроенный по-другому). В качестве обходного пути мы можем наследоваться от FileSystemStorage и определить собственный инициализатор.

После его применения любой может легко создавать миниатюры для чего угодно.
Можно создать собственный тег шаблона, подобный этому:

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)

Обратите внимание, что настройки менять не нужно.

Все 3 Комментарий

Вам нужно использовать какое-то хранилище, которое использует STATIC_ROOT, например, вы можете использовать 'django.core.files.storage.FileSystemStorage' и создать экземпляр с location=settings.STATIC_ROOT и base_url=settings.STATIC_URL, пожалуйста, продолжайте на stackoverflow, так как это не ошибка.

Спустя пять лет все еще нет возможности генерировать превью из статических файлов без изменения хранилища ПО УМОЛЧАНИЮ из-за https://github.com/mariocesar/sorl-thumbnail/blob/master/sorl/thumbnail/base.py#L100 .
StackOverflow не поможет из-за реализации.

Есть ли шансы это исправить? Достаточно передать экземпляр пользовательского хранилища через get_thumbnail() .

Вот пример патча https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab

РЕДАКТИРОВАТЬ : извините, кажется, что вывод из thumbnail.url действителен, но при извлечении из cached.url он имеет префикс /media/ вместо /static/ . Внутри еще что-то сломано.

РЕДАКТИРОВАТЬ (2) : существует проблема дизайна при десериализации кода хранилища - класс хранилища загружается и создается со значениями по умолчанию вместо использования существующего экземпляра. Другими словами - sorl.thumbnail не использует экземпляр хранилища повторно, а создает собственный (настроенный по-другому). В качестве обходного пути мы можем наследоваться от FileSystemStorage и определить собственный инициализатор.

После его применения любой может легко создавать миниатюры для чего угодно.
Можно создать собственный тег шаблона, подобный этому:

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)

Обратите внимание, что настройки менять не нужно.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги