2013-01-10 25 views
11

के साथ Django Sorl थंबनेल के साथ गलत यूआरएल मुझे अपने django प्रोजेक्ट में सॉर्ल थंबनेल का उपयोग करने में बहुत अजीब त्रुटि है जो मीडिया फ़ाइलों के लिए S3 का उपयोग करता है। मैंने इस जवाब में https://stackoverflow.com/a/12848650/538191 में बताया गया है और वास्तव में मेरी सभी अन्य मीडिया फ़ाइलों को सही ढंग से जेनरेट किया जा रहा है।अमेज़ॅन एस 3

लेकिन छवियों के लिए sorl थंबनेल के माध्यम से उत्पन्न मैं इस

https://he-s3.s3.amazonaws.com/cache/6f/cb/6fcb83175cb63f754fba9facec5dda7f.jpg?Signature=tgDEXyRV3gl3QtK%2BvwliqAtWqpM%3D&Expires=1357853609&AWSAccessKeyId=AKIAJLE6MUHDYS3HN6YQ

क्योंकि अपनी छवि यूआरएल के लिए S3 भंडारण पथ जोड़कर, लेकिन इसकी नहीं जोड़ने समस्या अजीब बात है की तरह एक यूआरएल हो रही है/मीडिया/के बीच में। यदि आप इसे

https://he-s3.s3.amazonaws.com/media/cache/6f/cb/6fcb83175cb63f754fba9facec5dda7f.jpg

छवि वास्तव में वहाँ मौजूद है, लेकिन जब से यूआरएल गलत बनाई जा रही है, मैं एक टूटी हुई छवि हो रही है। सेटिंग्स फ़ाइल में मैं s3boto का उपयोग कर DEFAULT_FILE_STORAGE घोषणा की है और इसमें

S3_URL = 'http://he-s3.s3-website-ap-southeast-1.amazonaws.com' 
MEDIA_URL = S3_URL + '/media/' 

मुझे समझ में क्यों sorl थंबनेल छवि मीडिया को शामिल नहीं में पथ करता है असफल।

किसी भी मदद की सराहना की जाती है।

अद्यतन

के बजाय हल किया जा रहा है, समस्या वास्तव में जटिल है। मैंने क्या किया था कि मैंने थंबनेल में केवीस्टोर को मंजूरी दे दी और सभी डेटाबेस को मंजूरी दे दी गई। मैं खुश था क्योंकि मैंने सोचा था कि समस्या हल हो गई थी, अब मुझे सही यूआरएल मिल रहा था। लेकिन फिर मैंने पृष्ठ को ताज़ा कर दिया, और फिर मुझे गलत यूआरएल मिल रहा था। मुझे समझ में नहीं आता कि क्या हो रहा है, अगर मैं थंबनेल डीबी साफ़ करता हूं, तो यह एक बार सही यूआरएल दिखाता है और उसके बाद यह गलत यूआरएल दिखाता है।

+1

पहले सुरक्षित यूआरएल हैं, पहले सुनिश्चित करें कि सेटिंग AWS_S3_SECURE_URLS गलत है, या AWS_S3_CUSTOM_DOMAIN सेटिंग –

+1

सेटअप है, मुझे भी इसी तरह की समस्या का सामना करना पड़ा। यदि आपका DEFAULT_FILE_STORAGE S3 के रूप में सेट है, तो आप MEDIA_URL = '/ media /' रख सकते हैं। लेकिन AWS सेटिंग AWS_LOCATION = '/ media /' सेटिंग जोड़ें। मुझे लगता है कि यह आपकी समस्या का समाधान करेगा। – chhantyal

उत्तर

28

मैं शर्त लगा सकता हूँ कि आप कुछ इस तरह का प्रयोग कर रहे:

MediaS3BotoStorage = lambda: S3BotoStorage(location='media') 

हालांकि इस sorl-थंबनेल में समस्याओं का कारण बनता है क्योंकि यह वर्ग के नाम का उपयोग कर कैश में भंडारण वर्ग serializes। बाद में जब यह deserializes, यह स्थान पैरामीटर के बिना S3BotoStorage() के रूप में तत्काल। यही कारण है कि यह आपके लिए पहली बार काम करता है लेकिन फिर बाद में विफल रहता है।

आपको फ़ैक्टरी के बजाय एक पूर्ण वर्ग का उपयोग करके इसे ठीक कर सकते हैं:

class MediaS3BotoStorage(S3BotoStorage): 
    location = 'media' 

आशा है कि मदद करता है!

+1

धन्यवाद! मेरा दिन बचाया! –

+1

भारी धन्यवाद :) –

+0

यदि 2017 में यह समस्या boto3 == 1.4.3 के साथ है तो आप इसके बजाय MediaRootS3BotoStorage का उपयोग करना बेहतर करेंगे। –