2012-03-23 9 views
13

Estoy usando el backend s3boto, no el backend s3.Usando django-storage y el backend s3boto, ¿cómo agrego información de almacenamiento en caché para solicitar encabezados para una imagen para que el navegador guarde en caché la imagen?

En el django-storages docs Dice para especificar la variable AWS_HEADERS en su archivo de settings.py:

AWS_HEADERS (opcionales)

Si desea establecer cabeceras enviadas con cada archivo de la almacenamiento:

# see http://developer.yahoo.com/performance/rules.html#expires 
AWS_HEADERS = { 
'Expires': 'Thu, 15 Apr 2010 20:00:00 GMT', 
'Cache-Control': 'max-age=86400', 
} 

Esto no funciona para mí.

Aquí es mi modelo:

class Photo(models.Model): 
    """ 
     docstring for Photo 
     represents a single photo.. a photo can have many things associated to it like 
     a project, a portfolio, etc... 
    """ 

    def image_upload_to(instance, filename): 
     today = datetime.datetime.today() 
     return 'user_uploads/%s/%s/%s/%s/%s/%s/original/%s' % (instance.owner.username, today.year, today.month, today.day, today.hour, today.minute, filename) 

    def thumb_upload_to(instance, filename): 
     today = datetime.datetime.today() 
     return 'user_uploads/%s/%s/%s/%s/%s/%s/thumb/%s' % (instance.owner.username, today.year, today.month, today.day, today.hour, today.minute, filename) 

    def medium_upload_to(instance, filename): 
     today = datetime.datetime.today() 
     return 'user_uploads/%s/%s/%s/%s/%s/%s/medium/%s' % (instance.owner.username, today.year, today.month, today.day, today.hour, today.minute, filename) 



    owner = models.ForeignKey(User) 
    # take out soon 
    projects = models.ManyToManyField('Project', through='Connection', blank=True) 
    image = models.ImageField(upload_to=image_upload_to) 
    thumb = ThumbnailerImageField(upload_to=thumb_upload_to, resize_source=dict(size=(102,102), crop='center'),) 
    medium = ThumbnailerImageField(upload_to=medium_upload_to, resize_source=dict(size=(700,525),)) 
    title = models.CharField(blank=True, max_length=300) 
    caption = models.TextField(blank=True) 
    can_view_full_res = models.BooleanField(default=False) 
    is_portfolio = models.BooleanField(default=False) 
    created_time = models.DateTimeField(blank=False, auto_now_add=True) 
    disabled = models.DateTimeField(blank=True, null=True, auto_now_add=False) 
    cost = models.FloatField(default=0) 
    rating = models.IntegerField(default=0) 
    mature_content = models.BooleanField(default=False) 
    objects = ViewableManager() 

    def get_absolute_url(self): 
     return "/m/photo/%i/" % self.pk 

    def get_prev_by_time(self): 
     get_prev = Photo.objects.order_by('-created_time').filter(created_time__lt=self.created_time) 
     try: 
      return get_prev[0] 
     except IndexError: 
      return None 

    def get_next_by_time(self): 
     get_next = Photo.objects.order_by('created_time').filter(created_time__gt=self.created_time) 
     try: 
      return get_next[0] 
     except IndexError: 
      return None 

    def __unicode__(self): 
     return(self.title) 

Esto es lo que está en mi plantilla en la que tengo la imagen ...

<img class='shadow' src='{{ object.medium.url }}'> 

Estas son las cabeceras de petición y respuesta:

Request URL:https://MY_UPLOAD_CONTAINER.s3.amazonaws.com/user_uploads/travismillward/2012/3/23/3/0/medium/_0677866898.jpg?Signature=s%2ByKsWDxrDJbyeVHd%2BDS3JlByts%3D&Expires=1332529522&AWSAccessKeyId=MY_ACCESS_KEYID 
Request Method:GET 
Status Code:200 OK 
Request Headersview parsed 
GET /user_uploads/travismillward/2012/3/23/3/0/medium/_0677866898.jpg?Signature=s%2ByKsWDxrDJbyeVHd%2BDS3JlByts%3D&Expires=1332529522&AWSAccessKeyId=MY_ACCESS_KEYID HTTP/1.1 
Host: MY_UPLOAD_CONTAINER.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.83 Safari/535.11 
Accept: */* 
Referer: http://localhost:8000/m/photo/1/ 
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 
Query String Parametersview URL encoded 
Signature:s+yKsWDxrDJbyeVHd+DS3JlByts= 
Expires:1332529522 
AWSAccessKeyId:MY_ACCESS_KEYID 
Response Headersview parsed 
HTTP/1.1 200 OK 
x-amz-id-2: wOWRRDi5TItAdiYSPf8X4z4I4v5/Zu8XLhwlxmZa8w8w1Jph8WQkenihVJI/ZKnV 
x-amz-request-id: THE_X_AMZ_REQUEST_ID 
Date: Fri, 23 Mar 2012 18:05:24 GMT 
Cache-Control: max-age=86400 
Last-Modified: Fri, 23 Mar 2012 09:00:13 GMT 
ETag: "6e34e718a349e0bf9e4aefc1afad3d7d" 
Accept-Ranges: bytes 
Content-Type: image/jpeg 
Content-Length: 91600 
Server: AmazonS3 

Cuando pegue la ruta de acceso a la imagen en la barra de direcciones, ENCAJA la imagen y me da un 304 ... Aquí están t solicitud de manguera y las cabeceras de respuesta:

Request URL:https://MY_UPLOAD_CONTAINER.s3.amazonaws.com/user_uploads/travismillward/2012/3/23/3/0/medium/_0677866898.jpg?Signature=evsDZiw3QGsjPacG4CHn6Ji2dDA%3D&Expires=1332528782&AWSAccessKeyId=MY_ACCESS_KEYID 
Request Method:GET 
Status Code:304 Not Modified 
Request Headersview parsed 
GET /user_uploads/travismillward/2012/3/23/3/0/medium/_0677866898.jpg?Signature=evsDZiw3QGsjPacG4CHn6Ji2dDA%3D&Expires=1332528782&AWSAccessKeyId=MY_ACCESS_KEYID HTTP/1.1 
Host: MY_UPLOAD_CONTAINER.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.83 Safari/535.11 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Referer: http://localhost:8000/m/photo/1/ 
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: "6e34e718a349e0bf9e4aefc1afad3d7d" 
If-Modified-Since: Fri, 23 Mar 2012 09:00:13 GMT 
Query String Parametersview URL encoded 
Signature:evsDZiw3QGsjPacG4CHn6Ji2dDA= 
Expires:1332528782 
AWSAccessKeyId:MY_ACCESS_KEYID 
Response Headersview parsed 
HTTP/1.1 304 Not Modified 
x-amz-id-2: LfdHa10SdWnx4UH1rc62NfUDeiNVGRzBX73CR+6GDrXJgv9zo+vyQ9A3HCr1YLVa 
x-amz-request-id: THE_X_AMZ_REQUEST_ID 
Date: Fri, 23 Mar 2012 18:01:16 GMT 
Last-Modified: Fri, 23 Mar 2012 09:00:13 GMT 
ETag: "6e34e718a349e0bf9e4aefc1afad3d7d" 
Server: AmazonS3 

Respuesta

19

Gracias a blackrobot que me dio esta respuesta.

Añadir lo siguiente a su settings.py:

AWS_QUERYSTRING_AUTH = False 
+1

he misma edición, he establecido 'AWS_QUERYSTRING_AUTH = false' y todavía no hay ayuda. Veo que las solicitudes a s3 se realizan como parte de autenticación, pero nada muestra que 'AWS_HEADERS' estén funcionando. – Neara

+0

@Neara ¿Copiará/pegará sus encabezados de solicitud en un contenedor de pasta o algo así y proporcionará un enlace? Le echaré un vistazo. – teewuane

+0

tuve un error en el formato 'Expires', y supongo que debido a que Amazon no lo usó. Después de implementar de nuevo después de la corrección, ahora veo 'Cache-Control' y' Expires' como se establece en la configuración. gracias por intentar ayudarme, realmente lo aprecio :) – Neara

Cuestiones relacionadas