Динамически создавать миниатюры изображений (используя django)

Я хотел бы динамически создавать эскизы на основе параметров в URL-адресе. Например, http://mysite.com/images/1234/120x45.jpg создать 120x45 эскиз для id изображения 1234.

очевидным решением этого является наличие представления django, которое делает следующее:

  1. найдите ранее кэшированную версию изображения такого размера.
  2. создайте эскиз, если он не кэшируется (некоторая логика для блокировки, так что только 1 процесс создает эскиз и другие процессы ждать.)
  3. передайте результаты через django.

Это должно "работать", но меня беспокоит производительность. Мне не нравится идея использования django для обслуживания статического контента. Каковы другие способы решения этой проблемы?

10 ответов


вам не нужно использовать Django для непосредственного обслуживания статического контента. Просто ваш сервер маршрутизирует 404 запроса для вашей папки изображений в представление Django, где он разделяет имя файла и генерирует соответствующий эскиз, прежде чем перенаправлять обратно на исходный URL (который, надеюсь, больше не будет 404).

Что касается предложения django-imagekit другого ответа, я не уверен, что он что-то делает, чтобы позволить вам динамически создать превью изображения на основе URL, но я, конечно, рекомендую использовать его для всех функций, которые у него есть.

Edit:

Что касается фактической структуры URL, я чувствую себя более типичным /images/filename-120x45.jpg позволит вам более легко отфильтровать 404 запроса, которые не имеют ничего общего с динамической генерации миниатюр. Скажем, например, что есть тонны 404 ошибок для /images/original_size_image.jpg. Вы не хотели бы, чтобы они направлялись в Django, и вы могли бы только сопоставлять имена файлов этого формата с regex. [редактирование]

вы должны быть осторожны, хотя о том, чтобы кто-нибудь знал об этой функции спама вашего приложения Django. Они потенциально могут убить его с бесконечным количеством комбинаций размера изображения и имени файла у них под рукой. Вам нужно будет выяснить, как поставить верхние пределы этих запросов, например, перенаправить обратно в 404, если любое измерение больше исходного, или даже выяснить, как ограничить запросы для нескольких измерений одного и того же изображения. Возможно это было то, что вы имели в виду, когда упоминали "блокировку".

в стороне, я вижу, что вы пометили Apache, но я бы очень хотел рекомендовать вам обслуживать статический контент через что-то вроде nginx и. Возможно, вы могли бы свести на нет дополнительные накладные расходы запросов динамических изображений, Если используете статический файловый сервер, который не является полным дерьмом при обслуживании статических файлов.


вы также можете попробовать sorl, Он используется Satchmo.


см. это приложение для создания больших пальцев.

разработано на Python с использованием сервера tornadoweb.

https://github.com/globocom/thumbor

pip install thumbor

Приложение



Я посмотрел эти ответы, и хотя они работают, Они были слишком мягкими для меня. Если вы просто хотите быстрый и грязный способ получить миниатюры, просто с помощью библиотеки PIL может быть хорошим вызовом, это мой код:

file, ext = os.path.splitext('image.jpg')
im = Image.open('/full/path/to/image.jpg')
im.thumbnail(size, Image.ANTIALIAS)
thumb_path = os.path.join('/full/path/to/thumb/dir/', file + ".thumb" + ".jpeg")
im.save(thumb_path)

загрузите библиотеку PIL здесь

Ура, надеется, что это кому-то поможет.


вы можете взглянуть на документация по эскизам sorl. Я использую его почти во всех своих проектах вместе с обслуживанием статического контента с Nginx из /media/ dir:)


проверьте эту страницу обсуждения о вкладе миниатюр для Django:

https://code.djangoproject.com/wiki/ThumbNails


У меня была такая же точная проблема: на сайте с высоким трафиком создание десятков эскизов во время ответа невозможно, как и создание эскизов для всего прошлого контента в пакете, поэтому я создал приложение для этого. Проверьте это: https://github.com/hcarvalhoalves/django-rest-thumbnails


Thumbor действительно отличный сервис, вы можете использовать django-thumbor на django.

pip install django-thumbor

здесь РЕПО : https://github.com/ricobl/django-thumbor


возможно, Вам просто нужно изменить размер изображения на дисплее, основываясь на указанном измерении, которое вам нужно, по требованию. The Django Imagefit библиотека делает именно это, и это также дает возможность для кадрирования.

в вашем примере вы напишете {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }} и вы закончите с изображением размера 120x45.