Динамически создавать эскизы изображений (используя django) - PullRequest
8 голосов
/ 21 января 2010

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

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

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

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

Ответы [ 10 ]

8 голосов
/ 21 января 2010

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

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

Edit:

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

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

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

5 голосов
/ 21 января 2010

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

4 голосов
/ 04 августа 2012

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

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

https://github.com/globocom/thumbor

pip install thumbor

Отличное приложение

2 голосов
/ 02 февраля 2012

Я посмотрел эти ответы, и хотя они работают, они были слишком изощренными для меня. Если вы просто хотите получить быстрый и грязный способ получения миниатюр, хороший вызов - использование библиотеки 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 здесь

Ура, надеюсь, это кому-нибудь поможет.

2 голосов
/ 27 января 2010

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

2 голосов
/ 21 января 2010
0 голосов
/ 27 марта 2018

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

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

0 голосов
/ 10 мая 2013

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

pip install django-thumbor

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

0 голосов
/ 30 октября 2012

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

0 голосов
/ 11 июля 2012

Посетите эту страницу обсуждения с миниатюрами для Джанго:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...