2012-02-24 18 views
9

tôi đã tạo một backend lưu trữ tùy chỉnh, các tập tin được gọi là storages.py và được đặt trong một ứng dụng gọi là core:Django - Lỗi khi nhập 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) 

Trong settings.py, tôi đã follwing:

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

Khi tôi cố gắng làm python manage.py collectstatic nó cho thấy các lỗi sau:

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

Và khi tôi chạy python manage.py shell và cố gắng nhập giống nhau:

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

Bất kỳ ý tưởng những gì tôi đang làm sai?

+0

Bạn có thể nhập một 'lõi .storages.S3StaticBucket' trong trình bao? Có lẽ bạn đã bỏ lỡ một tập tin '__init __. Py' ở đó. –

+0

Chỉ cần thử làm như vậy, tôi đã nhận 'ImportError: Không có mô-đun có tên backends.s3boto'. Tôi có một '__init __. Py' trống trong ứng dụng' core'. – abstractpaper

+0

Hm. Hãy thử để bình luận một 'từ storages.backends.s3boto nhập dòng S3BotoStorage' trong storages.py, và viết thay vì một' kho lưu trữ' và sau đó trong một dòng sau 'print storages .__ file__'. Sau đó nhập một 'core.storages.S3StaticBucket' vào trong shell. Sau đó nhập thủ công 'storages' trong shell và in' storages .__ file__'. Nếu các đường dẫn khác nhau - bạn có câu trả lời. –

Trả lời

7

Có xung đột không gian tên; storage xung đột tên tuyệt đối với tên địa phương là storage. Nó có thể là unintuitive, nhưng bạn có thể nhập từ mô-đun của riêng mình:

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

Bây giờ chúng ta chạy shell trăn trong một thư mục có chứa một my_module:

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

Nói tóm lại, mô-đun cố gắng nhập một backend từ chính nó.

Bạn cần nhập tuyệt đối - Trying to import module with the same name as a built-in module causes an import error.

+2

Cảm ơn bạn, đã thêm 'từ __future__ import_import' nhập và bây giờ nó hoạt động. – abstractpaper

4

Tôi đã có cùng một vấn đề này, nhưng đối với tôi nó chỉ ra rằng mặc dù django-storages đang được cài đặt, boto thì không. Một đơn giản pip install boto đã sửa lỗi trong kịch bản của tôi.

4

Tôi có một loại vấn đề khác có thể giúp người khác, tôi đã từng có một tệp khác có tên storages.py nhưng tôi đã xóa tệp đó ngày trước và vẫn nhận được ngoại lệ ... điều tôi chưa xóa tệp storages.pyc!

+1

Vâng, điều này cũng xảy ra với tôi. – ilovett

0

Lỗi lỗi. Thay đổi:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

TO:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3Boto3Storage'