Перейти к содержимому

Sorl thumbnail что это

  • автор:

Кэшируй массив

Пишу о веб-разработке, своей жизни и людях, которых встречаю.

пятница, 17 июня 2011 г.

Django admin и миниатюры фотографий с помощью sorl.thumbnail

Я придерживаюсь мнения, что использовать стандартную админку Django можно не только для целей разработки но и сдавать проект вместе с ней заказчику. Особенно это касается низкобюджетных проектов или в тех случаев, когда она позволит максимально понятно и быстро управлять контентом.
Админка вроде всем хороша но есть в ней пара моментов, которые портят картину. Один из них весьма условный — это отсутствие WYSIWYG редактора. Условный он потому, что вопреки разным мнениям я все же уверен, что нужен он далеко не всегда. В большенстве случаев можно и нужно обходится чем-то вроде markdown или вообще ничем.
Второй — редактирование объектов, содержащих изображение. Проще говоря это фотки, или другие объекты к которым прицеплены картинки.
Ориентироваться в списке фоток не видя этих самых фоток очень неудобно. И я давно намеревелся найти решение этой проблемы. Пример мой подойдет тем кто использует sorl.thumbnail для создания миниатюр на сайте. Но если у вас голова не из говна, то вам не составит труда переписать процесс получения url-а миниатюрки. В целом можно сказать, что вся фишка этого поста в том, как воткнуть миниатюрку в список объектов не редактируя шаблон . Идея взята из блога чувака по имени Филипп Рудь и описана она еще в 2009 году, но работает и по сей день. Я лишь приебашил к этому делу sorl.thumbnail.

Итак суть этого способа в том, чтобы создать метод модели, который и будет отдавать html код картинки. А потом, этот метод указать в настроечном классе админки в параметре list_display. Вот так оказалось все просто.
Вот код модели:

from sorl.thumbnail.shortcuts import get_thumbnail ... class Photos(models.Model): title = models.TextField(u'Заголовок') tags = TagField(u'Теги') image = ImageField(upload_to='img/photos/', verbose_name=u'Файл') def get_thumbnail_html(self): img = self.image img_resize_url = unicode(get_thumbnail(img, '100x100').url) html = '%s' return html % (self.image.url, img_resize_url, self.title) get_thumbnail_html.short_description = u'Миниатюра' get_thumbnail_html.allow_tags = True 

Вот настроечный класс:

class PhotoAdmin(admin.ModelAdmin): list_display = ['get_thumbnail_html', 'title', 'tags'] list_display_links = ['title', ] admin.site.register(Photos, PhotoAdmin) 

Кэшированные изображения sorl-thumbnail

В общем такая незадача, почистил вручную кэш картинок sorl-thumbnail’а (по умолчанию был media/cache), а они заново не создаются! Отсюда вопрос: как заново заполнить кэш? Как «сказать» sorl-thumbnail’у, что бы он закэшировал все заново? Вопрос конечно задал коряво, но не знаю как написать по-другому 🙂

Отслеживать
задан 31 янв 2011 в 15:38
2,778 2 2 золотых знака 17 17 серебряных знаков 27 27 бронзовых знаков
Вообще по логике кэш должен создаваться автоматически. Почему это не работает — ума не приложу 🙁
1 фев 2011 в 22:47

В общем какая-то проблема с библиотеками, настраивал проект на чистой системе — и картинки не генерируются вообще.

2 мая 2011 в 10:07
А что в директиве THUMBNAIL_BASEDIR записано? Советую проверить права доступа на директорию с кэшем.
2 мая 2011 в 10:14

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В общем решил вот как: включил в thumbnail отладку

THUMBNAIL_DEBUG = True 

и далее по хлебным крошкам из ошибок увидел,что thumbnail ломился в несуществующую папку

/media/cache 

, да и притом с полным доступом(это уже настройки моего локального сервера, я не заморачивался настройкой пользователей). В общем, создал папку, дал ей права — и все заработало 🙂 Отладку можно обратно менять на ‘False’.

Python-сообщество

[RSS Feed]

  • Начало
  • » Django
  • » Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

#1 Дек. 24, 2009 00:30:26

tezro От: Зарегистрирован: 2009-12-09 Сообщения: 90 Репутация: 0 Профиль Отправить e-mail

Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

В общем, есть такая вешь как sorl-thumbnail — http://thumbnail.sorl.net/docs/

Для тех, кто не знаком, потому как в форуме ни одного упоминания, поясню — это приложение для джанго, которое на базе ImageField создаёт несколько типов полей для работы с изображениями, упрощая создание и кеширование изображений, файлов и превью к ним.

Надежды на ответ мало 🙂 Но я попробую…

Есть поле ThumbnailField — http://thumbnail.sorl.net/docs/#thumbnailfield Сохраняет изображение и превью к нему, изменяя его размеры.
Есть поле ImageWithThumbnailsField — http://thumbnail.sorl.net/docs/#imagewiththumbnailsfield Сохраняет исходное изображение, превью к нему и, по желанию, несколько дополнительных миниатюр.

Вопрос: а как мне из загруженного в админке файла сделать 3 миниатюры (большую, среднюю, маленькую) не сохраняя оригинал. Кстати, если кто-то знает другое решение, а не набазе этого приложения, будет здорово.

Отредактировано (Дек. 24, 2009 00:33:05)

#2 Дек. 24, 2009 01:00:48

tezro От: Зарегистрирован: 2009-12-09 Сообщения: 90 Репутация: 0 Профиль Отправить e-mail

Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

Перезагрузка метода save(self) не подходит, так как джанга пляшет от имени оригинала, таки образом, сохраняя несколько изображений на диске сохранится 1 оригинал и N превьюшек — каждый раз при сейве на диске не будет оригинала.

#3 Дек. 24, 2009 12:28:34

slav0nic Команда От: dp.ua Зарегистрирован: 2006-05-07 Сообщения: 2259 Репутация: 41 Профиль Отправить e-mail

Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

это не есть правильно, все приложения такого плана сохраняют оригинал, ибо если ты захочешь новые тумбы добавить, то с чего ты их будешь генерить как не с оригинала) + эти аппы могут генерить “по вызову”, а не сразу, что опять таки требует наличие оригинала.

ThumbnailField имеет extra_thumbnails параметр

#4 Дек. 25, 2009 02:41:58

tezro От: Зарегистрирован: 2009-12-09 Сообщения: 90 Репутация: 0 Профиль Отправить e-mail

Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

slav0nic
…захочешь новые тумбы добавить, то с чего ты их будешь генерить как не с оригинала) + эти аппы могут генерить “по вызову”, а не сразу, что опять таки требует наличие оригинала.

slav0nic
ThumbnailField имеет extra_thumbnails параметр

tezro
…превью к нему и, по желанию, несколько дополнительных миниатюр.

Я просто волнуюсь, что файлы с разрешением 3000х2000 засрут хостинг. Но, окей.

#5 Дек. 25, 2009 11:48:33

slav0nic Команда От: dp.ua Зарегистрирован: 2006-05-07 Сообщения: 2259 Репутация: 41 Профиль Отправить e-mail

Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

ThumbnailField с extra_thumbnails на сколько я понимаю будет ресайзить 3000х2000 до нужно размера + можно ограничить макс размер

#6 Дек. 26, 2009 22:50:27

tezro От: Зарегистрирован: 2009-12-09 Сообщения: 90 Репутация: 0 Профиль Отправить e-mail

Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

slav0nic
ThumbnailField с extra_thumbnails на сколько я понимаю будет ресайзить 3000х2000 до нужно размера + можно ограничить макс размер

Всё так. Ресайзится оргомный оригинал в несколько превью. Но оргомный оригинал всё равно присутствует…

#7 Дек. 26, 2009 23:03:50

Ferroman От: Зарегистрирован: 2006-11-16 Сообщения: 2759 Репутация: 1 Профиль Отправить e-mail

Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

Можно переопределить save к модели, и там удалять оригинал.

def save(self):
super(ModelName, self).save()
#удаляем оригинал

Только не надо делать thumbnail_cleanup, иначе он не найдёт оригинал и поуничтажает нагенерённые копии.

#8 Дек. 27, 2009 04:58:12

tezro От: Зарегистрирован: 2009-12-09 Сообщения: 90 Репутация: 0 Профиль Отправить e-mail

Sorl // Как сохранять несколько видов превьюшек, не сохраняя оригинал?

Ferroman
Можно переопределить save к модели, и там удалять оригинал.

def save(self):
super(ModelName, self).save()
#удаляем оригинал

Только не надо делать thumbnail_cleanup, иначе он не найдёт оригинал и поуничтажает нагенерённые копии. Не не, это понятно. Удалять не надо. Я вот думаю, может ресайзить руками оригинал под скажем 2000х3000, удалять оригинал и переименовывать ресайз. Ну просто 20 фотографий по 5-10 мб это уже много… Да и не нужны оригиналы на серваке.

Какую ресайзилку изображений лучше использовать для Django и S3?

Изображения у меня хранятся на S3. Оптимальный вариант когда при сохранении мы генерирем отресайзенные изображения нужных размеров.

sorl.thumbnail — раньше использовал, но там одно время была проблема, с генерированием огромного количества SQL запросов. Не знаю решили ли они эту пробелму и нормально ли она работает с S3.

easy-thumbnails — вроде выглядит неплохо, возможно стоит попробовать.

Вобщем посоветуйте чем ресайзить.

  • Вопрос задан более трёх лет назад
  • 670 просмотров

3 комментария

Оценить 3 комментария

sim3x

>Оптимальный вариант когда при сохранении мы генерирем отресайзенные изображения нужных размеров.

не всегда — часто сервисам проще на лету ресайзить и ложить в кеш на определенное время

un1t @un1t Автор вопроса

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

sim3x

un1t: или такую же кучу серваков, чтоб нормально раздавать
Решения вопроса 0
Ответы на вопрос 3

mututunus

Backend developer (Python, Golang)
sorl.thumbnail отлично работает с s3. Для KVStore лучше использовать redis, а не базу.
Ответ написан более трёх лет назад
Нравится 1 1 комментарий
un1t @un1t Автор вопроса

Ну можно и редис, просто я как помню, у меня на 30 картинок генерировалось 170 SQL запросов, если к редису будет аналогичное количество, то это не подходит.

Укротитель питонов

Исходя из личного опыта: sorl-thumbnail — кровососина. Не потому что жмёт как-то не так, а потому что периодически теряет кеш, генгерирует тумбнейлы заново, а старые остаются сиротливо лежать на старом месте.

Когда используется облачное хранилище с оплатой за ресурсы, это дико напрягает. Опять же, из личного: на проекте, в котором были миллионы картинок, очистка кеша, хранящегося в Selectel Storage, заняла почти два месяца непрерывной работы. Сколько ушло лишних денег на оплату этого хранения, вспоминать не очень хочется.

В конечном счёте для того проекта я использовал thumbor — сервис для генерации тумбнейлов (он, правда, standalone, но вроде существуют попытки перенести его хранилища в S3). За ~полгода использования мысли такие: по сравнению с сорлом небо и земля. И скорость в разы больше, и RESTful-апи встроенное, и алгоритмы кропа изображений субъективно умнее.

Ставится, конечно, чуть сложнее, но оно того стоит. Очень рекомендую осилить.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *