9

我创建了一个自定义存储后端,该文件被调用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
>>> 

知道我做错了什么吗?

4

4 回答 4

8

存在命名空间冲突;绝对名称与本地名称storage冲突。storage这可能不直观,但您可以从模块本身导入:

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

现在我们在包含以下内容的目录中运行 python shell my_module

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

简而言之,您的模块尝试从自身导入后端。

您需要绝对导入 -尝试导入与内置模块同名的模块会导致导入错误

于 2012-02-24T21:20:27.633 回答
5

django-storages我遇到了同样的问题,但对我来说,尽管已安装,但事实boto并非如此。一个简单pip install boto的修复了我的场景中的错误。

于 2012-07-25T02:50:37.007 回答
4

我有另一种可以帮助其他人的问题,我曾经有另一个文件被命名storages.py,但我几天前删除了那个文件,但仍然得到异常......问题是我没有删除文件storages.pyc

于 2013-07-21T18:31:43.210 回答
0

打字错误。改变:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

到:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3Boto3Storage'

于 2017-12-01T18:55:25.397 回答