Я пытаюсь получить мои изображения с миниатюрами и сохранить их на s3, используя django-storageages, boto и sorl-thumbnail. У меня он работает, но он очень медленный, даже с небольшими изображениями. Я не возражаю, что это медленно, когда я сохраняю форму и загружаю изображения в s3, но мне хотелось бы, чтобы изображение было быстро после этого.
Ответ на этот вопрос SO объясняет, что миниатюра не будет создана до первого доступа, но вы можете использовать get_thumbnail() для ее создания заранее.
Django + S3 (boto) + Sorl Thumbnail: рекомендации по оптимизации
Я делаю это, и теперь кажется, что все записи в таблицу thumbnail_kvstore создаются при загрузке изображения, а не при его отображении.
Проблема в том, что страница, отображающая изображение, все еще очень медленная. Посмотрев панель регистрации на панели инструментов отладки, похоже, что с s3 все еще существует большая связь. Похоже, что после того, как изображение и миниатюры будут загружены и сохранены в кэше, страница должна быстро отобразиться без связи с s3.
Что я делаю неправильно? Спасибо!
Обновить: слабый хак, похоже, заработал, но я хотел бы знать, как это сделать правильно:
https://github.com/asciitaxi/sorl-thumbnail/commit/545cce3f5e719a91dd9cc21d78bb973b2211bbbf
Обновить: дополнительная информация для @sorl
Я работаю с 2 видами:
ADD VIEW: в этом представлении я представляю форму для создания модели с изображением в ней. Изображение загружается на s3. В сигнале post_save я вызываю get_thumbnail() для создания эскиза до его необходимости:
im = get_thumbnail(instance.image, '360x360')
DISPLAY VIEW: В этом представлении отображается эскиз, сгенерированный в окне добавления:
{% thumbnail object.image "360x360" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
Без патча:
ADD VIEW: создает 3 записи в таблице kvstore, обращается к кешу 10 раз (6 наборов, 4 получает), вкладка ведения журнала панели инструментов отладки говорит "установить HTTP-соединение" 12 раз
DISPLAY VIEW: все еще всего 3 записи в таблице kvstore, только 1 из кеша, но панель инструментов отладки говорит "установить HTTP-соединение" еще 3 раза
Только с изменением в строке 122:
ДОБАВИТЬ ПРОСМОТР: то же самое, что и выше, кроме журнала только говорит "установление HTTP-соединения" 2 раза ПРОСМОТР ДИСПЛЕЯ: то же, что и выше, за исключением того, что в протоколе указано только "установление HTTP-соединения" 1 раз
Также добавление изменения в строке 118:
ДОБАВИТЬ ПРОСМОТР: то же, что и выше, но теперь мы доходим до 2 сообщений об установлении HTTP-соединения ПРОСМОТР ДИСПЛЕЯ: то же, что и выше, без каких-либо сообщений о регистрации
UPDATE: похоже, что storage._setup() вызывается дважды, а storage.url() вызывается один раз. Основываясь на времени, я бы сказал, что каждый из них устанавливает соединения с s3:
1304711315.4
_setup
1304711317.84
1304711317.84
_setup
1304711320.3
1304711320.39
_url
1304711323.66
Это, по-видимому, отражается в протоколе boto, в котором говорится о "установлении HTTP-соединения" 3 раза.