2012-03-17 5 views
5

मैंने अभी अमेज़ॅन के एस 3 पर उपयोगकर्ता अपलोड की गई छवियों को संग्रहीत करना शुरू कर दिया है। यह बहुत अच्छा है क्योंकि यह मेरी स्टोरेज समस्या का ख्याल रखता है। हालांकि, जब ब्राउज़र ब्राउज़र छवियों को कैश करने की बात आती है तो मैं संघर्ष कर रहा हूं।django ऐप पर django-storages का उपयोग करते समय अमेज़ॅन एस 3 पर संग्रहीत छवियों के लिए 304 कैसे प्राप्त करें?

मैं django-storages का उपयोग कर रहा हूं। अपने दस्तावेज़ों में वे निर्दिष्ट करते हैं कि आप अपनी सेटिंग्स में AWS_HEADER var सेट करके किसी छवि के लिए अनुरोध शीर्षलेख पर चीज़ें डाल सकते हैं। मैं ऐसा कर रहा हूं और कोई परिणाम नहीं मिला।

असल में जब ऐप छवि (ओं) का अनुरोध करता है, तो मुझे 200 बार हर बार मिलता है। एआरजी ... जब मैं ब्राउज़र को सीधे छवि पर ले जाता हूं (लिंक को एक नई विंडो में कॉपी और पेस्ट करें) मुझे इसके बाद हर बार एक 2004 मिलता है।

यह बहुत निराशाजनक है क्योंकि यह हर बार छवि डाउनलोड करता है। कुछ पृष्ठों पर उनके ऊपर 25 छोटे थंबनेल होते हैं और जब भी पृष्ठ को पुनः लोड किया जाता है, तब भी यह सबकुछ फिर से लोड हो जाता है।

मैं djangos staticfiles का उपयोग करके अपनी स्थिर फाइलों की सेवा कर रहा हूं और वे ठीक से काम कर रहे हैं। फाइल को कैश करने के बाद मुझे 200 मिलते हैं, फिर 304 मिलते हैं।

यहाँ

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 
यहाँ

जब एप्लिकेशन छवि का अनुरोध के लिए अनुरोध और प्रतिक्रिया हेडर हैं: (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 
यहाँ

जब मैं स्वयं छवि के लिए प्रतिलिपि और चिपकाने लिंक द्वारा छवि का अनुरोध के लिए अनुरोध/प्रतिक्रिया हेडर हैं:

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

मुझे लगता है कि "अगर-कोई नहीं-मैच:" या "अगर-संशोधित-चूंकि:" जैसे कुछ अंतर हैं। मुझे लगता है कि अगर मैं उन्हें सेट करना चाहता था, तो यह काम करना चाहिए जैसा मैं चाहूंगा।

क्या ऐसा करने का कोई आसान तरीका है?

किसी भी मदद के लिए धन्यवाद!

संपादित करें 1: मैं इस लेख पढ़ सकते हैं और यह बहुत अच्छी तरह से अनुवाद नहीं कर सकता .. http://coder.cl/2012/01/django-and-amazon-s3/comment-page-1/

उत्तर

5

आप अपने स्थिर मीडिया के लिए प्रमाणन क्वेरी जोड़ना Django-भंडार नहीं करना चाहते हैं, के लिए निम्न जोड़ने के अपने settings.py:

AWS_QUERYSTRING_AUTH = False 

यह S3 Boto बैकएंड के कारण होता है, जो अपने आप में संलग्न कर देगा प्रश्न स्ट्रिंग जब तक निर्देश नहीं दिया जाता है, django-storages के माध्यम से। यदि आप एप्लिकेशन के लिए source code देखते हैं, तो आप देखेंगे कि यह आपकी settings.py फ़ाइल (लगभग 34 के आसपास) में कुछ अतिरिक्त अनियंत्रित सेटिंग्स ढूंढता है।

मैंने जिथब पर डीजेंगो-कंप्रेसर here के लिए उठाए गए इसी तरह के मुद्दे का जवाब दिया।

+0

आपको बहुत बहुत धन्यवाद !!! मैं हमेशा के लिए इस के साथ लड़ रहा हूँ !! मेरी पहली कोशिश पर काम किया। वाह मैं एक खुश कैंपर हूँ! – teewuane

1

यह आपको एक "अगर कोई मिलान नहीं वाले" या भेज रहे हैं की तरह "अगर-Modified- नहीं लगती है चूंकि "आपके ऐप के अनुरोध में, इसलिए एस 3 के पास आपको 304 वापस भेजने का कोई तरीका नहीं है क्योंकि उसे पता नहीं है कि आपके पास क्या है। जैसा कि आप देख सकते हैं कि आपके ब्राउज़र में फ़ाइल कैश की गई है, इसलिए यह उन दोनों शीर्षकों को भेज रहा है और उचित 304 प्रतिक्रिया प्राप्त कर रहा है।

यदि आप फ़ाइलों की स्थानीय प्रतियां रखते हैं, तो आपको अंतिम-संशोधित और/या ईटाग स्टोर करना होगा और उन्हें छवि के लिए आपके अनुरोध के साथ भेजना होगा।

एक तरफ से, मैं केवल अधिकतम आयु के शीर्षलेख का उपयोग करने और समाप्ति समाप्त करने पर विचार करता हूं। Spec के अनुसार, Expires should not be more then a year in the future। दोनों समाप्ति और अधिकतम आयु का उपयोग अनावश्यक है, और अधिकतम आयु को एक सापेक्ष राशि (जैसा आपने किया है) पर सेट किया जा सकता है।

मैं आपकी कॉन्फ़िगरेशन की जांच के लिए this article on caching और उसके संबंधित REDbot टूल की अत्यधिक अनुशंसा करता हूं।

संबंधित मुद्दे