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

StackOverflow https://stackoverflow.com/questions/2106507

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Очевидное решение - иметь представление Django, которое выполняет следующее:

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

Это должно «работать», но я обеспокоен производительностью. Мне не нравится идея использования Django для обслуживания статического контента. Каковы другие способы выполнить эту проблему?

Это было полезно?

Решение

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

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

Редактировать:

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

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

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

Другие советы

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

Смотрите это приложение, чтобы генерировать большие пальцы.

Разработано в Python, используя Tornadoweb Server.

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 здесь

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

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

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

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

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

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

pip install django-thumbor

Репо здесь:https://github.com/ricobl/django-thumbor

Возможно, вам просто потребуется изменять размер изображения на дисплее, на основе указанного измерения, которое вам нужно, по требованию. А Django ImageFit Библиотека делает именно это, и она также дает возможность обрести.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top