【问题标题】:Django - Error importing storages.backendsDjango - 导入 storages.backends 时出错
【发布时间】:2012-03-14 21:42:15
【问题描述】:

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

知道我做错了什么吗?

【问题讨论】:

  • 你也可以在 shell 中导入 core.storages.S3StaticBucket 吗?也许你错过了一个__init__.py 文件。
  • 刚刚尝试这样做,我得到了ImportError: No module named backends.s3boto。我在应用程序core 中有一个空的__init__.py
  • 嗯。尝试在 storages.py 中注释 from storages.backends.s3boto import S3BotoStorage 行,并改为写 import storages,然后在下一行 print storages.__file__ 中。然后在 shell 中导入一个core.storages.S3StaticBucket。然后在shell中手动导入storages并打印storages.__file__。如果路径不同 - 你有你的答案。
  • 它们确实是不同的路径! storages.py 中的 storages 指的是它自己(编译后的文件):/home/ubuntu/project/core/storages.pyc,而第二个 storages 指的是包本身:/usr/local/lib/python2.7/dist-packages/storages/__init__.pyc。因此,在storages.py 中导入的storages 似乎将自己视为默认存储,而不是settings.py 中定义的存储,我不明白。知道为什么会这样吗?
  • 我在下面的答案中添加了一个可能的解决方案。

标签: django django-storage


【解决方案1】:

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

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

现在我们在一个包含my_module的目录中运行python shell:

$ 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

【讨论】:

  • 谢谢,添加了from __future__ import absolute_import,现在可以使用了。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 是的,这也发生在我身上。
    【解决方案4】:

    错字。 变化:

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

    到:

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3Boto3Storage'

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 2015-02-14
      • 2015-10-10
      • 2013-05-10
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2013-10-28
      相关资源
      最近更新 更多