2012-03-23 12 views
13

Tôi đang sử dụng phụ trợ s3boto chứ không phải phụ trợ s3.Sử dụng django-storages và s3boto backend, Làm cách nào để thêm thông tin bộ nhớ đệm để yêu cầu tiêu đề cho hình ảnh để trình duyệt lưu hình ảnh?

Trong django-storages docs nó nói để xác định các biến AWS_HEADERS trong hồ sơ settings.py của bạn:

AWS_HEADERS (không bắt buộc)

Nếu bạn muốn thiết lập các tiêu đề gửi với mỗi tập tin của lưu trữ:

# 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', 
} 

Điều này không hiệu quả đối với tôi.

Đây là mô hình của tôi:

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) 

Đây là những gì là trên mẫu của tôi, nơi tôi có hình ảnh ...

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

Sau đây là các yêu cầu và đáp ứng tiêu đề:

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 

Khi tôi dán đường dẫn đến hình ảnh vào thanh địa chỉ, nó sẽ lưu hình ảnh và đưa cho tôi 304 ... Đây là t yêu cầu ống và đáp ứng tiêu đề:

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 

Trả lời

19

Cảm ơn bạn blackrobot người đã cho tôi câu trả lời này.

Thêm dòng sau vào settings.py của bạn:

AWS_QUERYSTRING_AUTH = False 
+1

tôi đã cùng một vấn đề, tôi đã thiết 'AWS_QUERYSTRING_AUTH = false' và vẫn không có sự giúp đỡ. tôi thấy rằng các yêu cầu đối với s3 được thực hiện bằng phần xác thực, nhưng không có gì cho thấy rằng 'AWS_HEADERS' đang hoạt động. – Neara

+0

@Neara Bạn sẽ sao chép/dán các tiêu đề yêu cầu của mình vào thùng dán hay gì đó và cung cấp liên kết? Tôi sẽ có một cái nhìn. – teewuane

+0

tôi đã gặp lỗi trong định dạng 'Expires', và tôi đoán là do amazon không sử dụng nó. Sau khi triển khai một lần nữa sau khi sửa chữa, bây giờ tôi thấy 'Cache-Control' và' Expires' như được thiết lập trong cài đặt. cảm ơn bạn đã cố gắng giúp tôi tho, thực sự đánh giá cao nó :) – Neara

Các vấn đề liên quan