2012-02-24 12 views
9

he creado un backend de almacenamiento personalizada, el archivo se llama storages.py y se coloca en una aplicación llamada core:Django - storages.backends error importación

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) 

En settings.py, tengo el follwing:

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

Cuando intento hacer python manage.py collectstatic se muestra el siguiente error:

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

Y cuando corro python manage.py shell y tratar de importar el mismo:

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

Alguna idea de lo que estoy haciendo mal?

+0

¿Es capaz de importar un 'núcleo .storages.S3StaticBucket' en shell también? Tal vez te perdiste un archivo '__init __. Py' allí. –

+0

Acabo de intentar hacerlo, recibí 'ImportError: Ningún módulo llamado backends.s3boto'. Tengo un "__init __. Py" vacío en la aplicación 'core'. – abstractpaper

+0

Hm. Intente comentar una línea 'from storages.backends.s3boto import S3BotoStorage' en storages.py, y escriba en su lugar un' import storage' y luego en la siguiente línea 'print storage.__ file__'. Luego, importe un 'core.storages.S3StaticBucket' en shell. A continuación, importe manualmente "almacenamientos" en shell e imprima 'almacenamientos .__ archivo__'. Si las rutas son diferentes, tienes tu respuesta. –

Respuesta

7

Hay un conflicto de espacio de nombres; el nombre absoluto storage choca con un nombre local storage. Puede ser poco intuitivo, pero se puede importar desde el módulo en sí mismo:

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

Ahora corremos el intérprete de Python en un directorio que contiene un my_module:

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

En resumen, el módulo intenta importar un backend de si mismo.

Necesita una importación absoluta - Trying to import module with the same name as a built-in module causes an import error.

+2

Gracias, agregó 'de __future__ import absolute_import' y ahora funciona. – abstractpaper

4

Tuve el mismo problema, pero para mí resulta que a pesar de que se instaló django-storages, no. Un simple pip install boto corrigió el error en mi escenario.

4

Tuve otro tipo de problema que puede ayudar a los demás, solía tener otro archivo llamado storages.py pero lo eliminé hace días, y aún recibo la excepción ... el problema es que no había eliminado el archivo storages.pyc!

+1

Sí, esto también me pasó a mí. – ilovett

0

Error de error. Cambio:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

A:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3Boto3Storage'