Django — ошибка импорта storages.backends

Я создал собственное хранилище, файл называется storages.py и помещается в приложение с именем core:

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 у меня есть следующее:

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
>>> 

Любая идея, что я делаю неправильно?


person Aziz Alfoudari    schedule 24.02.2012    source источник
comment
Вы также можете импортировать core.storages.S3StaticBucket в оболочку? Возможно, вы пропустили там файл __init__.py.   -  person Wojciech Żółtak    schedule 24.02.2012
comment
Только что попробовал так сделать, получил ImportError: No module named backends.s3boto. У меня есть пустой __init__.py в приложении core.   -  person Aziz Alfoudari    schedule 25.02.2012
comment
Хм. Попробуйте прокомментировать строку from storages.backends.s3boto import S3BotoStorage в storages.py и написать вместо нее import storages, а затем в следующей строке print storages.__file__. Затем импортируйте core.storages.S3StaticBucket в оболочку. Затем вручную импортируйте storages в оболочку и напечатайте storages.__file__. Если пути различаются - у вас есть свой ответ.   -  person Wojciech Żółtak    schedule 25.02.2012
comment
Это действительно разные пути! storages в storages.py относится к самому себе (скомпилированному файлу): /home/ubuntu/project/core/storages.pyc, а второй storages относится к самому пакету: /usr/local/lib/python2.7/dist-packages/storages/__init__.pyc. Таким образом, похоже, что storages, который импортируется в storages.py, считает себя хранилищем по умолчанию вместо определенного в settings.py, чего я не понимаю. Любая идея, почему это происходит?   -  person Aziz Alfoudari    schedule 25.02.2012
comment
Я добавил возможное решение в ответ ниже.   -  person Wojciech Żółtak    schedule 25.02.2012


Ответы (4)


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

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

Теперь мы запускаем оболочку Python в каталоге, содержащем my_module:

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

Короче говоря, ваш модуль пытается импортировать бэкэнд из самого себя.

Вам нужен абсолютный импорт - Попытка импортировать модуль с тем же именем, что и у встроенного модуля, вызывает ошибка импорта.

person Wojciech Żółtak    schedule 24.02.2012
comment
Спасибо, добавил from __future__ import absolute_import и теперь работает. - person Aziz Alfoudari; 25.02.2012

У меня была такая же проблема, но для меня оказалось, что, несмотря на то, что django-storages был установлен, boto не был. Простой pip install boto исправил ошибку в моем сценарии.

person Parker    schedule 25.07.2012

У меня была проблема другого типа, которая может помочь другим, раньше у меня был другой файл с именем storages.py, но я удалил этот файл несколько дней назад и все равно получаю исключение... дело в том, что я не удалил файл storages.pyc!

person dulaccc    schedule 21.07.2013
comment
Ага, это случилось и со мной. - person ilovett; 03.01.2014

Ошибка печати. Изменять:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

TO:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3Boto3Storage'

person Roby96    schedule 01.12.2017