Django easy-thumbnails vs sorl-thumbnails Отличия
Я читал и пробовал различные приложения для создания эскизов для Django. Это требования:
Все сгенерированные эскизы должны быть сохранены в корзине S3 отдельно от исходных изображений, т. Е. В отдельном классе хранения
Когда экземпляр изображения удаляется, исходный файл изображения вместе со всеми созданными миниатюрами также должен быть удален.
Минимизируйте дорогую неэффективность, напр. Извлечение URL-адреса миниатюры для сериализации в DRF не должно смотреть в S3, чтобы увидеть, существует ли он каждый раз и т. Д.
VersatileImageField не выполняет первое требование. ImageKit не выполняет второе требование. Третье требование - то, где я больше всего смущен; Я пытаюсь рассказать о лучших практиках, но информация фрагментирована, и я не уверен в принятии решения на основе того, что я узнал до сих пор.
Из того, что я прочитал, у меня сложилось впечатление, что наиболее эффективное поведение будет следующим:
- создать миниатюру сразу после сохранения и предположить, что она всегда существует
- чтобы получить доступ к миниатюре, создайте URL-адрес на основе имени исходного изображения и размеров / качества миниатюр, поскольку мы знаем, что он определенно существует
- post_delete удалит все миниатюры и оригинальный файл
Мне было бы очень интересно узнать о различиях в подходах, которые используют easy-thumbnails и sorl-thumbnail (если они соответствуют процессу, который я очень кратко изложил выше, или если у них есть что-то еще более эффективное), а также о преимуществах / недостатках в каждой из своих методологий.
2 ответа
Я надеюсь, что это может помочь вам в модели, есть два поля: изображение и миниатюра, чтобы сделать проверку типа и размера изображения, после чего сгенерировать миниатюру с помощью таблетки
from PIL import Image as Img
from io import BytesIO
def create(self,request):
mutable = request.POST._mutable
request.POST._mutable = True
for value in request.FILES.items():
im = Img.open(value[1])
im.thumbnail((425, 236), Img.ANTIALIAS)
buffer = BytesIO()
im.save(fp=buffer, format='JPEG')
requset.POST['thumbnail'] = ContentFile(buffer.getvalue(), thumnail_name)
request.POST._mutable = mutable
для сохранения изображений в папке и в другой папке с эскизами вы можете использовать другой путь с upload_to в ImageField
Я не уверен, что это полезно, но в прошлом я использовал easy-thumbnails, и я совершенно уверен, что он выполняет все то, о чем вы просите, если вы немного его настроите. Настроить его с помощью функции сохранения немного сложно, так как функция сохранения не требует настройки, но это не невозможно. Главное, что может вызвать проблемы, это то, что вам нужно использовать "сохранить и продолжить редактирование", чтобы получить доступ к опции миниатюр. Он не будет виден, пока вы не сделаете это, если вы еще не создали его, так как он был создан при сохранении.
def save()
found_id = self.id
super(Team, self).save(*args, **kwargs)
if self.image and found_id is None and self.original_image_width and self.original_image_height:
self.image = get_thumbnailer(self.image).get_thumbnail({
'size': (self.original_image_width, self.original_image_height)
}).name
super(Team, self).save(*args, **kwargs)