2012-03-17 24 views
5

Tôi vừa bắt đầu lưu trữ hình ảnh do người dùng tải lên trên S3 của Amazon. Nó khá đẹp vì nó đã xử lý vấn đề lưu trữ của tôi. Tuy nhiên, tôi đang vật lộn khi nói đến việc có bộ nhớ cache của trình duyệt hình ảnh.cách lấy 304 cho hình ảnh được lưu trữ trên amazon s3 khi sử dụng django-storages trên ứng dụng django?

Tôi đang sử dụng django-storages. Trong tài liệu của họ, họ chỉ định rằng bạn có thể đặt mọi thứ vào tiêu đề yêu cầu cho hình ảnh bằng cách đặt biến AWS_HEADER trong cài đặt của bạn. Tôi đang làm điều đó và không có kết quả.

Về cơ bản khi ứng dụng yêu cầu (các) hình ảnh, tôi nhận được 200 EVERY TIME. ARG ... khi tôi đưa trình duyệt thẳng đến hình ảnh (sao chép và dán liên kết vào một cửa sổ mới), tôi nhận được 200 sau đó là 304 mỗi lần sau đó.

Rất bực bội vì nó tải xuống lại hình ảnh mỗi lần. Một số trang có tối đa 25 hình thu nhỏ nhỏ và chúng tải xuống mọi thứ mỗi khi trang được tải lại.

Tôi đang phân phát tệp tĩnh của mình bằng cách sử dụng các tệp tĩnh djangos và chúng hoạt động đúng cách. Tôi nhận được 200, sau đó 304 sau khi tệp được lưu vào bộ nhớ cache.

đây là thiết lập AWS của tôi trong 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 

đây là những yêu cầu và đáp ứng tiêu đề cho khi ứng dụng yêu cầu hình ảnh: (i đã thay thế những gì tôi cảm thấy có thể là thông tin nhạy cảm với '* ')

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

đây là những tiêu đề yêu cầu/đáp ứng cho khi tôi tự đề nghị hình ảnh bằng cách sao chép và dán liên kết đến hình ảnh:

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

Tôi thấy có một số khác biệt như "Nếu không có sự phù hợp" hoặc "Nếu được sửa đổi-Từ:". Tôi nghĩ rằng nếu tôi thiết lập chúng, thì nó sẽ hoạt động như tôi muốn.

Có cách nào dễ dàng để thực hiện việc này không?

Cảm ơn bạn đã trợ giúp!

EDIT 1: Tôi đọc bài viết này và không thể dịch nó rất tốt .. http://coder.cl/2012/01/django-and-amazon-s3/comment-page-1/

Trả lời

5

Nếu bạn không muốn django-kho để thêm các truy vấn auth truyền thông tĩnh của bạn, thêm dòng sau vào bạn settings.py:

AWS_QUERYSTRING_AUTH = False 

này được gây ra bởi sự backend S3 Boto, mà sẽ tự động nối chuỗi truy vấn trừ khi được hướng dẫn không, qua django-storages. Nếu bạn nhìn vào số source code cho ứng dụng, bạn sẽ nhận thấy rằng nó tìm kiếm một số cài đặt không có giấy tờ bổ sung trong tệp settings.py của bạn (xung quanh dòng 34).

Tôi đã trả lời vấn đề tương tự này được nêu ra trên Github cho django-compressor here.

+0

Cảm ơn bạn rất nhiều !!! Tôi đã chiến đấu với điều này bao giờ hết !! Làm việc trong lần thử đầu tiên của tôi. Wow Tôi là một người cắm trại hạnh phúc! – teewuane

1

Nó không giống như bạn đang gửi một "Nếu-Không-Khớp" hoặc "If-Modified- Vì "trong yêu cầu của ứng dụng, vì vậy S3 không có cách nào để gửi lại cho bạn 304 vì nó không biết bạn có gì. Như bạn có thể thấy trình duyệt của bạn có tệp được lưu trong bộ nhớ cache, do đó, nó sẽ gửi cả hai tiêu đề đó và nhận được phản hồi 304 phù hợp.

Nếu bạn đang giữ bản sao tệp cục bộ, bạn sẽ cần lưu trữ Lần sửa đổi lần cuối và/hoặc ETag và gửi cùng với yêu cầu của bạn cho hình ảnh.

Là một bên liên quan, tôi chỉ xem xét sử dụng tiêu đề tối đa và bỏ qua Hết hạn. Theo thông số kỹ thuật, Expires should not be more then a year in the future. Sử dụng cả Expires và max-age là dư thừa và độ tuổi tối đa có thể được đặt thành số tiền tương đối (như bạn đã làm).

Tôi khuyên bạn nên this article on caching và công cụ REDbot có liên quan để kiểm tra cấu hình của bạn.

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