2012-02-24 19 views
9

मैं एक कस्टम भंडारण बैकएंड बनाया है, फ़ाइल storages.py कहा जाता है और किसी ऐप में रखा गया है core कहा जाता है:Django - आयात करने में त्रुटि storages.backends

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

class S3StaticBucket(S3BotoStorage): 
    def __init__(self, *args, **kwargs): 
     kwargs['bucket_name'] = getattr(settings, 'static.mysite.com') 
     super(S3BotoStorage, self).__init__(*args, **kwargs) 

settings.py में, मैं follwing है

STATICFILES_STORAGE = 'core.storages.S3StaticBucket' 
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

जब मैं python manage.py collectstatic करने के लिए यह निम्न त्रुटि से पता चलता कोशिश:

django.core.exceptions.ImproperlyConfigured: Error importing storage module core.storages: "No module named backends.s3boto" 

और आयात करने के लिए जब मैं python manage.py shell चलाने के लिए और कोशिश एक ही:

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

किसी भी विचार क्या मैं गलत कर रहा हूँ?

+0

आप एक आयात करने में सक्षम हैं 'कोर .storages.S3StaticBucket 'खोल में भी? हो सकता है कि आपने वहां '__init __। Py' फ़ाइल को याद किया हो। –

+0

बस ऐसा करने का प्रयास किया, मुझे 'ImportError: backends.s3boto नामक कोई मॉड्यूल नहीं मिला। ऐप 'कोर' में मेरे पास खाली '__init __। Py' है। – abstractpaper

+0

एचएम। Storages.py में storages.backends.s3boto आयात S3BotoStorage' लाइन से 'टिप्पणी करने का प्रयास करें, और इसके बजाय' आयात स्टोरेज 'लिखें और फिर निम्न पंक्ति' प्रिंट स्टोरेज .__ file__' में लिखें। फिर खोल में 'core.storages.S3StaticBucket' आयात करें। फिर मैन्युअल रूप से खोल में 'स्टोरेज' आयात करें और 'storages .__ file__' प्रिंट करें। यदि पथ भिन्न हैं - आपके पास आपका जवाब है। –

उत्तर

7

नामस्थान संघर्ष है; storage पूर्ण नाम storage स्थानीय नाम के साथ संघर्ष करता है। यह unintuitive हो सकता है, लेकिन आप अपने आप में मॉड्यूल से आयात कर सकते हैं:

// file my_module/clash.py 
import clash 
print clash.__file__ 

अब हम एक निर्देशिका एक my_module युक्त अजगर खोल चलाएँ:

$ python 
>>> import my_module.clash 
my_module.clash.py 

संक्षेप में, अपने मॉड्यूल एक बैकएंड आयात करना चाहता है स्वयं से।

आपको एक पूर्ण आयात की आवश्यकता है - Trying to import module with the same name as a built-in module causes an import error

+2

धन्यवाद, __future__ आयात absolute_import' से जोड़ा गया और यह अब काम करता है। – abstractpaper

4

मुझे यह वही समस्या थी, लेकिन मेरे लिए यह पता चला कि django-storages स्थापित होने के बावजूद, boto नहीं था। एक साधारण pip install boto ने मेरे परिदृश्य में त्रुटि को ठीक किया।

4

मेरे पास एक और प्रकार का मुद्दा था जो दूसरों की मदद कर सकता था, मेरे पास storages.py नाम की एक और फ़ाइल थी, लेकिन मैंने उस फ़ाइल को दिन पहले हटा दिया था, और अभी भी अपवाद प्राप्त कर रहा था ... बात यह है कि मैंने फ़ाइल को हटा नहीं दिया था storages.pyc!

+1

हाँ, यह मेरे साथ भी हुआ। – ilovett

0

टाइपो त्रुटि। बदलें:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

के लिए:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3Boto3Storage'

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