2012-03-17 2 views
5

Я только начал хранить загруженные пользователем изображения на S3 Amazon. Это довольно хорошо, потому что он позаботился о моей проблеме с хранилищем. Тем не менее, я борюсь, когда дело доходит до того, что браузер кэширует изображения.Как получить 304 изображений, хранящихся на amazon s3 при использовании django-хранилищ в приложении django?

Я использую django-хранилища. В своих документах они указывают, что вы можете поместить вещи в заголовок запроса для изображения, установив параметр AWS_HEADER var в свои настройки. Я делаю это и не получаю никаких результатов.

В основном, когда приложение запрашивает изображения, я получаю 200 КАЖДОЕ ВРЕМЯ. ARG ... когда я беру браузер прямо к изображению (скопируйте и вставьте ссылку в новое окно), я получаю 200 и 304 каждый раз после этого.

Это очень неприятно, потому что оно повторно загружает изображение каждый раз. На некоторых страницах имеется до 25 маленьких эскизов, и при каждом перезагрузке страницы она перезагружается.

Я обслуживаю свои статические файлы с помощью djangos staticfiles, и они работают исправно. Я получаю 200, затем 304 после кэширования файла.

вот мои настройки AWS в settings.py

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
AWS_ACCESS_KEY_ID = '***' 
AWS_SECRET_ACCESS_KEY = '***' 
AWS_STORAGE_BUCKET_NAME = 'foobar_uploads' 
AWS_HEADERS = { 
    'Expires': 'Thu, 15 Apr 2020 20:00:00 GMT', 
    'Cache-Control': 'max-age=86400', 
} 

AWS_CALLING_FORMAT = CallingFormat.SUBDOMAIN 

вот заголовки запроса и ответа для того, когда приложение запрашивает изображение: (я заменил то, что я чувствую, может быть конфиденциальной информацией с «* «)

##request## 
GET /user_uploads/*****/2012/3/17/14/46/thumb_a_28_DSC_0472.jpg?Signature=FVR6T%2BXFwHMmdQ9K3n7Ppp7QxoY%3D&Expires=1332023525&AWSAccessKeyId=***** HTTP/1.1 
Host: *****_user_uploads_sandbox.s3.amazonaws.com 
Connection: keep-alive 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11 
Accept: */* 
Referer: http://localhost:8000/m/my-photos/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 


##response## 
HTTP/1.1 200 OK 
x-amz-id-2: Hn3S+3gmeLHIjKCpz+2ocE6aPsLCVHh56jJYTsPHwxU98y89x+9X1Ml202evBUHT 
x-amz-request-id: 528CEB880CA89AD3 
Date: Sat, 17 Mar 2012 21:32:06 GMT 
Cache-Control: max-age=86400 
Expires: Thu, 15 Apr 2020 20:00:00 GMT 
Last-Modified: Sat, 17 Mar 2012 20:46:29 GMT 
ETag: "a3bc70e0c3fc0deb974edf95668e9030" 
Accept-Ranges: bytes 
Content-Type: image/jpeg 
Content-Length: 8608 
Server: AmazonS3 

вот заголовки запроса/ответа для того, когда я вручную запросить изображение путем копирования и вставки ссылки на изображение:

##request## 
GET /user_uploads/*****/2012/3/17/14/46/thumb_a_28_DSC_0472.jpg?Signature=FVR6T%2BXFwHMmdQ9K3n7Ppp7QxoY%3D&Expires=1332023525&AWSAccessKeyId=***** HTTP/1.1 
Host: porlio_user_uploads_sandbox.s3.amazonaws.com 
Connection: keep-alive 
Cache-Control: max-age=0 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
If-None-Match: "a3bc70e0c3fc0deb974edf95668e9030" 
If-Modified-Since: Sat, 17 Mar 2012 20:46:29 GMT 



##response## 
HTTP/1.1 304 Not Modified 
x-amz-id-2: FZH0imrbNxziMznhl5zAoo38CaM7Z+TFnd8R6HtTYB3eTmVpCih+1IniKaliRo18 
x-amz-request-id: 3CACF77FBB39D088 
Date: Sat, 17 Mar 2012 21:33:22 GMT 
Last-Modified: Sat, 17 Mar 2012 20:46:29 GMT 
ETag: "a3bc70e0c3fc0deb974edf95668e9030" 
Server: AmazonS3 

Я вижу, есть несколько отличий, таких как «If-None-Match:» или «If-Modified-Since:». Я думаю, что если бы я их установил, тогда он должен работать, как хотелось бы.

Есть ли простой способ сделать это?

Спасибо за помощь!

EDIT 1: Я прочитал эту статью и не мог перевести его очень хорошо .. http://coder.cl/2012/01/django-and-amazon-s3/comment-page-1/

ответ

5

Если вы не хотите Джанго-хранилища, чтобы добавить запрос аутентификации в ваши статические среды, добавьте следующие строки в ваш settings.py:

AWS_QUERYSTRING_AUTH = False 

Это вызвано бэкэндом S3 Boto, который будет автоматически добавлять строка запроса, за исключением случаев, когда это запрещено, через django-хранилища. Если вы посмотрите на source code для приложения, вы заметите, что он ищет некоторые дополнительные недокументированные настройки в вашем файле settings.py (около строки 34).

Я ответил на эту аналогичную проблему, поднятую на Github для django-компрессора here.

+0

Спасибо вам большое! Я сражаюсь с этим навсегда! Работал с моей первой попытки. Ничего себе, я счастливый турист! – teewuane

1

Это не выглядит, как вы отправляете «If-None-Match» или «If-модифицированным Поскольку «в запросе вашего приложения, поэтому S3 не имеет возможности отправить вам 304, поскольку он не знает, что у вас есть. Как вы можете видеть, ваш браузер имеет кешированный файл, поэтому он отправляет оба этих заголовка и получает правильный ответ 304.

Если вы сохраняете локальные копии файлов, вам необходимо сохранить Last-Modified и/или ETag и отправить их вместе с запросом на изображение.

Как относящийся в стороне, я бы предпочел использовать только заголовок максимального возраста и пропустить Expires. Согласно спецификации, Expires should not be more then a year in the future. Использование как Expires, так и max-age избыточно, а max-age можно установить на относительную величину (как вы это сделали).

Я настоятельно рекомендую this article on caching и его соответствующий REDbot инструмент для проверки вашей конфигурации.

 Смежные вопросы

  • Нет связанных вопросов^_^