2012-03-17 9 views
5

Acabo de comenzar a almacenar imágenes cargadas por el usuario en el S3 de Amazon. Es bastante agradable porque solucionó mi problema de almacenamiento. Sin embargo, estoy luchando cuando se trata de tener el navegador en caché de las imágenes.cómo obtener un 304 para imágenes almacenadas en amazon s3 al usar django-storage en la aplicación django?

Estoy usando django-storages. En sus documentos, especifican que puede colocar cosas en el encabezado de solicitud de una imagen configurando la varilla AWS_HEADER en su configuración. Estoy haciendo eso y no obtengo ningún resultado.

Básicamente cuando la aplicación solicita la imagen (s), obtengo un 200 CADA VEZ. ARG ... cuando llevo el navegador directamente a la imagen (copie y pegue el enlace en una nueva ventana) obtengo un 200 y luego un 304 cada vez después de eso.

Es muy frustrante porque siempre descarga la imagen. Algunas páginas tienen hasta 25 miniaturas pequeñas y está volviendo a descargar todo cada vez que se vuelve a cargar la página.

Estoy sirviendo mis archivos estáticos usando djangos staticfiles y están funcionando correctamente. Obtengo un 200, luego 304 después de que el archivo se almacena en caché.

aquí están mis ajustes de AWS en 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 

aquí están las cabeceras de petición y respuesta para cuando la aplicación solicita la imagen: (i he reemplazado lo que siento que podría ser información sensible con '* ')

##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 

aquí están las cabeceras de petición/respuesta para cuando solicite la imagen de copia y pegar manualmente enlace a la imagen:

##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 

Veo que hay algunas diferencias como "If-None-Match:" o "If-Modified-Since:". Creo que si tuviera que establecerlos, debería funcionar como me gustaría.

¿Hay una manera fácil de hacer esto?

¡Gracias por cualquier ayuda!

EDIT 1: He leído este artículo y no pude traducir muy bien .. http://coder.cl/2012/01/django-and-amazon-s3/comment-page-1/

Respuesta

5

Si no desea que django-almacenamientos añadir la consulta de autenticación a sus medios estáticos, añada lo siguiente a su settings.py:

AWS_QUERYSTRING_AUTH = False 

Esto es causado por el servidor S3 Boto, que se añadirá automáticamente la cadena de consulta a menos que se le indique que no, a través de django-storage. Si mira el source code para la aplicación, notará que busca configuraciones adicionales no documentadas en su archivo settings.py (alrededor de la línea 34).

Respondí a este problema similar planteado en el Github para django-compressor here.

+0

¡Muchas gracias! ¡He estado peleando con esto para siempre! Trabajé en mi primer intento. ¡Guau, soy una campista feliz! – teewuane

1

no se ve como si estuviera enviando una "If-None-Match" o "Si-Modified- Dado que "en la solicitud de su aplicación, por lo que S3 no tiene forma de devolverle un 304, ya que no tiene idea de lo que tiene. Como puede ver, su navegador tiene el archivo en la memoria caché, por lo que está enviando ambos encabezados y obteniendo una respuesta 304 adecuada.

Si está guardando copias locales de los archivos, deberá almacenar los Last-Modified y/o ETag y enviarlos junto con su solicitud de la imagen.

Como un aspecto relacionado, consideraría usar solo el encabezado max-age y omitir Expires. De acuerdo con la especificación, Expires should not be more then a year in the future. El uso de Expires y de max-age es redundante, y max-age se puede establecer en una cantidad relativa (como lo ha hecho).

Recomiendo encarecidamente this article on caching y su herramienta relacionada REDbot para verificar su configuración.

Cuestiones relacionadas