2012-09-30 14 views
8

मैं django-storages और sorl_thumbnail का उपयोग कर रहा हूं और मैं स्थिर और मीडिया फ़ाइलों के लिए अमेज़ॅन एस 3 का उपयोग कर रहा हूं। मैं 2 फ़ोल्डरों के साथ एक बाल्टी का उपयोग कर रहा हूं, स्थिर के लिए 1 और मीडिया के लिए 1।django-storages + sorl_thumbnail + S3 अच्छी तरह से काम नहीं कर रहा है (यूआरएल मेल नहीं खाता)

MEDIA_ROOT = '/media/' 
MEDIA_URL = 'https://s3.amazonaws.com/my-bucket/media/' 
STATIC_ROOT = '/static/' 
STATIC_URL = 'https://s3.amazonaws.com/my-bucket/static/' 
AWS_STORAGE_BUCKET_NAME = 'my-bucket' 
DEFAULT_FILE_STORAGE = 'my_lib.s3utils.MediaRootS3BotoStorage' 
STATICFILES_STORAGE = 'my_lib.s3utils.StaticRootS3BotoStorage' 

MediaRootS3BotoStorage और StaticRootS3BotoStorage इस तरह परिभाषित कर रहे हैं:

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') 
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media') 

जब मैं sorl_thumbnail उपयोग कर रहा हूँ, थंबनेल उत्पन्न सही निर्देशिका में स्थित हैं: https://s3.amazonaws.com/my-bucket/media/cache लेकिन जब

यहाँ मेरी config है sorl_thumbnail पहले से मौजूद थंबनेल को पुनः प्राप्त करने का प्रयास कर रहा है, उत्पन्न यूआरएल है: https://s3.amazonaws.com/my-bucket/cache, आप देखेंगे कि media फ़ोल्डर छोड़ा गया है।

क्या आपको कोई विचार है कि मैं इसे कैसे ठीक कर सकता हूं?

मैं जानता हूँ कि मैं सिर्फ Django-भंडार इस्तेमाल कर सकते हैं और सभी मेरी बाल्टी में मिश्रित मेरी स्थिर और मीडिया फ़ाइलों है, लेकिन है कि एक सा भी मेरे स्वाद :)

धन्यवाद के लिए गंदा है!

उत्तर

17

मैं इस प्रकार MediaRootS3BotoStorage और को परिभाषित करने StaticRootS3BotoStorage से यह काम कर सकता था:

from storages.backends.s3boto import S3BotoStorage 
from django.conf import settings 

class StaticRootS3BotoStorage(S3BotoStorage): 
    """ 
    Storage for static files. 
    """ 

    def __init__(self, *args, **kwargs): 
     kwargs['location'] = 'static' 
     super(StaticRootS3BotoStorage, self).__init__(*args, **kwargs) 


class MediaRootS3BotoStorage(S3BotoStorage): 
    """ 
    Storage for uploaded media files. 
    """ 

    def __init__(self, *args, **kwargs): 
     kwargs['location'] = 'media' 
     super(MediaRootS3BotoStorage, self).__init__(*args, **kwargs) 

यह लिंक सहायक हो सकता है https://github.com/jamstooks/django-s3-folder-storage

+1

उपरोक्त '__init __() 'विधियों में से प्रत्येक पर' सुपर()' विधियां गलत वर्गों को बुला रही हैं। वे किया जाना चाहिए: 'सुपर (StaticRootS3BotoStorage, आत्म) .__ init __ (* args, ** kwargs)' और 'सुपर (MediaRootS3BotoStorage, आत्म) .__ init __ (* args, ** kwargs)' – niceguydave

1

क्या आपने THUMBNAIL_PREFIX को मीडिया/कैश/पर सेट करने का प्रयास किया है?

http://sorl-thumbnail.readthedocs.org/en/latest/reference/settings.html#thumbnail-prefix

+2

हां, मैंने पहले ही कोशिश की है, धन्यवाद। लेकिन यह या तो काम नहीं करता है, समस्या वही होगी, उदाहरण के लिए यदि मैं 'मीडिया/कैश' सेट करता हूं, जब फ़ाइलों को धक्का दिया जाता है तो यूआरएल '/ मीडिया/मीडिया/कैश' होगा, वांछित होने पर wand/कैश' –

1

मैं इस एक ही सटीक समस्या थी लेकिन मैं इसे चारों ओर एक तरीका खोज निकाला।

मैं सेट मेरी DEFAULT_FILE_STORAGE वापस storages.backends.s3boto.S3BotoStorage को, कि जिस तरह से, जब यह cache/ के लिए देखा यह याद नहीं होगा, और मैं अभी भी media/ करने के लिए अपने फ़ाइलों के सभी अपलोड कर सकते हैं, और python manage.py collectstatic अभी भी ठीक से काम करता है क्योंकि मैं अभी भी StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') के रूप में है कि सेट है ।

आशा है कि यह आपकी मदद करे, क्योंकि यह समस्या मुझे पागल कर रही थी।

+0

आपकी मदद के लिए धन्यवाद! लेकिन जब मैं इन सेटिंग्स का उपयोग करता हूं तो मेरे लिए परिणाम स्थिर फाइलें एस 3 पर/स्थिर/फ़ोल्डर पर जाती हैं लेकिन सभी अपलोड की गई फाइल रूट फ़ोल्डर में होती हैं, वे/मीडिया/में नहीं जाते हैं। कोई उपाय? –

+0

देर से प्रतिक्रिया के लिए खेद है, लेकिन यह सुनिश्चित करें कि आपके मॉडल में आप 'UPLOAD_TO =' मीडिया/''का उपयोग कर रहे हैं। इससे आपकी अपलोड की गई फाइलें रखनी चाहिए जहां आप उन्हें चाहते हैं। –

+0

हाँ, मैंने अनुमान लगाया कि आप कर रहे थे, लेकिन मैं नहीं चाहूंगा, अन्यथा यह सिर्फ इस उद्देश्य को तोड़ता है कि कैसे django काम करता है :) वैसे भी धन्यवाद! –

0

मिले sorl-thumbnail है कि संचय KV छवि url लौटने STATIC_URL का उपयोग करके (आरंभिक थंबनेल के बाद अगले अनुरोध पर)। दिखाई देता है MEDIA_URL कोई प्रभाव नहीं पड़ता है।

सबसे अच्छा समाधान नहीं है। S3 रूटिंग नियम जोड़ा गया।

<RoutingRules> 
    <RoutingRule> 
    <Condition> 
     <KeyPrefixEquals>cache/</KeyPrefixEquals> 
    </Condition> 
    <Redirect> 
     <ReplaceKeyPrefixWith>media/cache/</ReplaceKeyPrefixWith> 
    </Redirect> 
    </RoutingRule> 
</RoutingRules> 
8

मुझे वही समस्या थी और सल्मा हैम्ड द्वारा समाधान मेरे लिए सही साबित हुआ।

इससे पहले कि हम

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') 
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media') 

जो हमारे thumbnail_kvstore तालिका में गलत 'भंडारण' मूल्यों में हुई थी।यह लैम्ब्डा परिभाषा एक नई कक्षा नहीं बनाती है और इस प्रकार टाइप करें (StaticRootS3BotoStorage()) 'storages.backends.s3boto.S3BotoStorage' देता है, जो तालिका में लिखा जाता है। चूंकि इन 'स्टोरेज' मानों को प्रदर्शित होने पर छवि URL प्राप्त करने के लिए बाद में स्टोरेज को तुरंत चालू करने के लिए उपयोग किया जाता है, इसके परिणामस्वरूप इसके लिए S3BotoStorage() का उपयोग किया जाता है। तो 'स्थान' तर्क खो गया था।

सल्मा हैम्ड का समाधान जो इन कस्टम स्टोरेज को परिभाषित करता है क्योंकि कक्षाएं इसे हल करती हैं।

इसके लिए धन्यवाद!

+0

क्या आपको याद है कि आपने 'लैम्ब्डा: S3BotoStorage (location =' static ') के पिछले समाधान का उपयोग करना सीखा था? मैं एक टिप्पणी पोस्ट करना या इसे सही करना चाहता हूं। – Flimm

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