Установка и настройка easy-thumbnail в Django
Установка и настройка easy-thumbnail в Django
Категория: Разработка Теги: Веб-разработка Опубликовано: 19 июня 2022

Миниатюры в Django при помощи easy-thumbnail

Сегодня я расскажу как установить и настроить в Django библиотеку для создания миниатюр easy-thumbnail, которая поможет сжать динамические картинки на веб-странице.

Скорость загрузки веб-страницы самый важный параметр, так как при скорости загрузки от 3 секунд и выше пользователь скорее всего закроет сайт не дожидаясь окончания загрузки. И так как у нас всех сегодня есть там или иная метрика, будь то яндекс метрика или гугл аналитикс, то выходит, что поисковые системы могут отслеживать такие посещения, начиная от перехода из поиска и заканчивая временем просмотра страницы 0,03 минуты. Такой показатель сигнализирует отказ и при высоком показателе отказов ваша страница понижается в поиске. Иными словами, это самый важный поведенческий фактор ранжирования.

Чаще всего большую часть веса занимают картинки, и если статические ресурсы можно один раз пережать вручную и изменить размер под отображаемый на веб-странице. Однако, как быть если у вас большой каталог товаров и требуется наличие превьюшек, то есть чтобы человек мог нажать на миниатюру картинки и увидеть полноразмерное изображение. Если тут пережать, то полноразмерный режим пострадает, создавать вручную через теги picture и img две версии изображения это долго и муторно. Представьте, 1500 материалов и каждый нужно пережать под два размера. Решением данной проблемы в Django можно назвать библиотеку easy-thumbnail.

Для начала нужно установить библиотеку easy-thumbnail командой:

pip install easy_thumbnail

Далее открываем settings.py и добавляем в блок INSTALLED_APPS элемент:

'easy_thumbnails',

Далее в конце settings.py добавляем настройки для easy-thumbnail:

THUMBNAIL_ALIASES = {
    '': {
        'my_preview_1': {'size': (250, 180), 'crop': 'smart'},
        'my_preview_2': {'size': (500, 0), 'crop': 'smart'},
        'my_preview_3': {'size': (75, 0), 'crop': 'smart'},
    },
}

Где my_preview это варианты обрезки картинки. Напишите свои варианты с подходящими для вас размерами. Если вторую цифру поставить 0, тогда по вертикали обрезаться картинка не будет.

Сохраняем изменения и открываем косноль, в которой пишем команду:

python manage.py migrate

easy-thumbnail создаст служебные таблицы в базе данных. Картинки будут хранится в папке media, а в базе данных будут храниться ссылочки на них.

Теперь нужно отредактировать шаблоны из папки templates. Откройте шаблон с динамическими картинками, который необходимо отредактировать. В начало html файла нужно добавить:

{% load thumbnail %}

Далее в этом же файле нужно отредактировать блок с картинками. Например, было:

<img src="{{ obj.photo' }}" alt="{{ obj.title }}" 
title="{{ obj.title }}" class="img-fluid" 
width="250" height="180">

Нужно добавить в источник фото thumbnail_url:'my_preview_1', теперь стало:

<img src="{{ obj.photo|thumbnail_url:'my_preview_1' }}" 
alt="{{ obj.title }}" title="{{ obj.title }}" class="img-fluid"
width="250" height="180">

Также могу предложить конструкцию для страницы материалов:

{% if obj.photo %}

<div align="center">

<a href="{{ obj.photo.url }}" data-lightbox="image-1" 
data-title="{{ obj.photo_title }}">
 
<picture srcset="{{ obj.photo.url }}">

<img src="{{ obj.photo|thumbnail_url:'my_preview_2' }}" 
alt="{{ obj.photo_title }}" title="{{ obj.photo_title }}" 
width="500" class="img-fluid">

</picture>

</a>
</div>
{% endif %}

Обратите внимание на data-lightbox="image-1" - это сигнал для превью, но для его работы нужно добавить в блок head lightbox.css и lightbox.js в конце документа. Иначе превью работать не буду. Описывать как сделать превью не буду, так как статья не про это.

Теперь нужно пояснить, хотя в случае с Python\Django всё из кода само по себе становится понятно, но все же.

Строкой {% if obj.photo %} мы проверяем наличие фотографии в данном объекте, и не забывайте про {% endif %} в конце условия.

<div align="center"> нужен просто для того, чтобы изображение отображалось по середине холста.

Обратите внимание, что в теге a и picture источником указывается {{ obj.photo.url }}, а в теге img указывается уже {{ obj.photo }}, то есть в thumbnail нужно передать объект, а не ссылку на картинку. Если в easy-thumbnail передать {{ obj.photo.url }}, тогда возникнет ошибка.

Правильное написание для библиотеки миниатюр источника в теге img такое src="{{ obj.photo|thumbnail_url:'my_preview_2' }}" . В thumbnail_url мы передаём профиль сжатия из настроек.

Алексей Черемных
4300