2012-02-24 3 views
9

я создал бэкэнд пользовательских хранений, файл называется storages.py и помещаются в приложении под названием core:Джанго - Ошибка при импорте 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' в приложении' core'. – abstractpaper

+0

Hm. Попытайтесь прокомментировать 'from storages.backends.s3boto импорт строки S3BotoStorage' в storageages.py и вместо этого напишите' import storageages', а затем в следующей строке 'print storageages .__ file__'. Затем импортируйте «core.storages.S3StaticBucket» в оболочку. Затем вручную импортируйте 'хранилища' в shell и print' storageages .__ file__'. Если пути отличаются - у вас есть свой ответ. –

ответ

7

Существует конфликт пространства имен; Абсолютное имя storage сталкивается с локальным именем storage. Это может быть неинтуитивным, но вы можете импортировать из модуля в себя:

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

Теперь мы запускаем оболочку Python в директории, содержащей 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

Спасибо, добавил 'from __future__ import 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'

TO:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3Boto3Storage'