s3boto

2012-02-07 3 views
14

में कई S3 बाल्टी की ओर इशारा करते settings.py में मेरे पास है:s3boto

STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
AWS_ACCESS_KEY_ID = 'xxxxxxxxxxxxx' 
AWS_SECRET_ACCESS_KEY = 'xxxxxxxxxxxxx' 
AWS_STORAGE_BUCKET_NAME = 'static.mysite.com' 

यह मेरा S3 बाल्टी static.mysite.com की ओर इशारा करते और ठीक काम करता है है जब मैं manage.py collectstatic करते हैं, यह मेरी बाल्टी के लिए सभी स्थैतिक फ़ाइलें अपलोड करता है।

class Image(models.Model): 
    myobject = models.ImageField(upload_to='my/folder') 

अब जब Image.save() शुरू हो जाती है, यह अभी भी करेंगे: हालांकि, मैं एक और बाल्टी जो मैं विभिन्न प्रयोजनों के लिए इस्तेमाल करते हैं और अगर मैं इस तरह एक मॉडल है, वेबसाइट के कुछ क्षेत्रों में उपयोग करने के लिए उदाहरण के लिए करना चाहते हैं AWS_STORAGE_BUCKET_NAME में फ़ाइल को एस 3 बाल्टी में अपलोड करें, हालांकि मुझे यह Image.save() अन्य एस 3 बाल्टी पर इंगित करने के लिए चाहिए। कोई भी साफ करने के लिए तरीका? मैं रन समय में settings.py को बदलना नहीं चाहता हूं और न ही किसी भी प्रथा को कार्यान्वित करता हूं जो डीजेंगो के प्रमुख सिद्धांतों का उल्लंघन करता है, यानी एक आसान आसानी से बदलने वाले बैकएंड स्टोरेज को।

उत्तर

23

आपके लिए सबसे साफ तरीका S3BotoStorage का उप-वर्ग बनाना होगा, और init विधि में डिफ़ॉल्ट बाल्टी नाम ओवरराइड करना होगा।

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

class MyS3Storage(S3BotoStorage): 
    def __init__(self, *args, **kwargs): 
     kwargs['bucket'] = getattr(settings, 'MY_AWS_STORAGE_BUCKET_NAME') 
     super(MyS3Storage, self).__init__(*args, **kwargs) 

फिर अपने DEFAULT_FILE_STORAGE के रूप में इस वर्ग को निर्दिष्ट और छोड़ STATICFILES_STORAGE के रूप में यह है, या प्रतिकूल शिकंजा।

+0

अच्छा! आप इस कक्षा को कहां रखने की सलाह देते हैं? – abstractpaper

+0

कहीं आपकी परियोजना में। मेरे पास आमतौर पर अलग ऐप होता है जहां मैं सभी प्रोजेक्ट-विशिष्ट चीजें रखता हूं। –

+1

कोर ऐप यह है, बहुत बहुत धन्यवाद। – abstractpaper