Подтвердить что ты не робот

Неверный URL с миниатюрой Django Sorl с Amazon s3

У меня очень странная ошибка при использовании эскизов sorl в моем проекте django, который использует S3 для медиафайлов. Я сделал свои настройки, как указано в этом ответе qaru.site/info/485208/..., и на самом деле все мои другие медиафайлы создаются правильно.

Но для изображений, созданных с помощью эскизов sorl, я получаю URL-адрес, подобный этому

https://he-s3.s3.amazonaws.com/cache/6f/cb/6fcb83175cb63f754fba9facec5dda7f.jpg?Signature=tgDEXyRV3gl3QtK%2BvwliqAtWqpM%3D&Expires=1357853609&AWSAccessKeyId=AKIAJLE6MUHDYS3HN6YQ

Проблема странная, потому что она добавляет путь хранения S3 к URL-адресу изображения, но не добавляет /media/in between. Если вы отметили

https://he-s3.s3.amazonaws.com/media/cache/6f/cb/6fcb83175cb63f754fba9facec5dda7f.jpg

изображение на самом деле существует, но поскольку URL-адрес генерируется неправильно, я получаю сломанное изображение. В файле настроек я объявил DEFAULT_FILE_STORAGE, используя s3boto, и он содержит

S3_URL = 'http://he-s3.s3-website-ap-southeast-1.amazonaws.com'
MEDIA_URL = S3_URL + '/media/'

Я не понимаю, почему путь в миниатюрном изображении Sorl не содержит носителя.

Любая помощь приветствуется.

Обновить

Вместо того, чтобы быть решенным, проблема на самом деле усугубляется. Я сделал то, что я очистил KVStore в миниатюре, и вся база данных была очищена. Я был счастлив, потому что думал, что проблема решена, теперь я получаю правильный URL. Но затем я обновил страницу, и снова я получил неправильный URL. Я не понимаю, что происходит, если я очищаю миниатюру db, он показывает правильный URL-адрес один раз и после этого снова показывает неправильный URL-адрес.

4b9b3361

Ответ 1

Готов поспорить, что вы используете что-то вроде этого:

MediaS3BotoStorage = lambda: S3BotoStorage(location='media')

Однако это вызывает проблемы в sorl-thumbnail, поскольку он сериализует класс хранения в кеш с использованием имени класса. Позже, когда он десериализуется, он создается как S3BotoStorage() без параметра местоположения. Вот почему он работает в первый раз для вас, но потом не работает позже.

Вы можете исправить это, используя полноценный класс вместо factory:

class MediaS3BotoStorage(S3BotoStorage):
    location = 'media'

Надеюсь, что это поможет!