2009-07-05 24 views
8

Tengo un proyecto Django que parece funcionar bastante bien con settings.py, que también importó local_settings.py sin problema.Problema al importar archivos en Django settings.py

ahora hemos añadido las siguientes líneas al final del archivo de configuración:

try: 
    from extras import * 
except ImportError, e: 
    print "import extras failed :: " + `e` 

extras.py es un archivo de información de configuración adicional sentado en el mismo directorio que settings.py y local_settings.py Sin embargo, ahora estoy consiguiendo:

import extras failed :: ImportError('Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.',) 

Esto parece ser debido a mí tratando de

from django.contrib.auth.models import User,UserManager 
from django.db import models 

en ese archivo extras.py.

¿Alguien tiene alguna idea?

aplausos

Respuesta

17

Típicamente, tiene una línea como

from django.db import models 

en settings.pyvoluntad conducen a una dependencia circular. Esto causa un error de importación, que se informa de forma ligeramente diferente en las diferentes versiones de Django. Por ejemplo, si añado que la línea a una configuración de Django trabajo e invoco "manage.py shell", me sale:

Error: Can't find the file 'settings.py' in the directory containing './manage.py'. It appears you've customized things. You'll have to run django-admin.py, passing it your settings module. (If the file settings.py does indeed exist, it's causing an ImportError somehow.)

Si quito esa línea, todo está bien otra vez.

La razón es que la maquinaria de carga modelo de Django (que se encuentra en las django.db.models paquete) settings.py importaciones, lee su INSTALLED_APPS para ver lo que se deben instalar aplicaciones, y luego carga esas aplicaciones. (Puede confirmarlo mediante la adición de una declaración de impresión a __init__.py para una de las aplicaciones instaladas.)

Si intenta importar django.db cosas en settings.py, que dará lugar a una dependencia de la importación circular y un mensaje de error -relacionado ImportError.

Una solución es mover la funcionalidad que requiere las importaciones problemáticas (y las importaciones mismas) a una aplicación.

+2

+1 La regla general es que nunca se importe nada de Django en settings.py. –

+0

Vea aquí, para más detalles: http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html – dhill

3

Entonces, ¿cómo es DJANGO_SETTINGS_MODULE conjunto en su entorno? Podría ser eso, o el resultado de la importación implícita de configuraciones que sus otras importaciones anidadas están causando mientras se está importando la configuración, una "dependencia circular" que puede tener varios efectos desagradables (aunque no creo que tenga la el específico que estás observando, entonces me inclino hacia la primera hipótesis).

Cuestiones relacionadas