2012-02-24 11 views
9

Stworzyłem backend zwyczaj przechowywania, plik nazywa storages.py i jest umieszczony w aplikacji o nazwie core:Django - Błąd importowania 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) 

W settings.py mam follwing:

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

Kiedy próbuję zrobić python manage.py collectstatic pokazuje następujący błąd:

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

A kiedy biegnę python manage.py shell i spróbować zaimportować ten sam:

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

Każdy pomysł co robię źle?

+0

Czy jesteś w stanie zaimportować 'rdzeń .storages.S3StaticBucket' również w powłoce? Może przegapiłeś tam plik '__init __. Py'. –

+0

Po prostu próbowałem to zrobić, otrzymałem 'ImportError: No module named backends.s3boto'. Mam puste '__init __. Py' w aplikacji' core'. – abstractpaper

+0

Hm. Spróbuj skomentować 'from storages.backends.s3boto importuj linię S3BotoStorage' w pliku storages.py i napisz zamiast niej' importuj magazyny', a następnie w następującej linii 'print storages .__ file__'. Następnie zaimportuj 'core.storages.S3StaticBucket' w powłoce. Następnie ręcznie zaimportuj 'magazyny' w powłoce i wydrukuj' magazyny .__ plik__'. Jeśli ścieżki się różnią - masz odpowiedź. –

Odpowiedz

7

Istnieje konflikt przestrzeni nazw; bezwzględna nazwa storage koliduje z lokalną nazwą storage. To może być nieintuicyjne, ale można importować z modułu w sobie:

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

Teraz możemy uruchomić Pythona powłokę w katalogu zawierającym my_module:

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

Krótko mówiąc, moduł próbuje zaimportować backend od samego siebie.

Potrzebujesz bezwzględnego importu - Trying to import module with the same name as a built-in module causes an import error.

+2

Dziękuję, dodano 'from __future__ import absolute_import' i teraz działa. – abstractpaper

4

Miałem ten sam problem, ale dla mnie okazało się, że pomimo zainstalowania django-storages, nie było boto. Prosty pip install boto naprawił błąd w moim scenariuszu.

4

Miałem inny typ problemu, który może pomóc innym, miałem inny plik o nazwie storages.py, ale usunąłem ten plik kilka dni temu i nadal otrzymuję wyjątek ... chodzi o to, że nie usunąłem pliku storages.pyc!

+1

Tak, to też mi się przydarzyło. – ilovett

0

Błąd literowy. Zmiana:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

TO:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3Boto3Storage'

Powiązane problemy