Error de configuración de Django DB 'incorrectamente configurado'

170

Django (1.5) funciona bien para mí, pero cuando enciendo el intérprete de Python (Python 3) para verificar algunas cosas, obtengo el error más extraño cuando intento importar - from django.contrib.auth.models import User-

Traceback (most recent call last):
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 36, in _setup
    settings_module = os.environ[ENVIRONMENT_VARIABLE]
  File "/usr/lib/python3.2/os.py", line 450, in __getitem__
    value = self._data[self.encodekey(key)]
KeyError: b'DJANGO_SETTINGS_MODULE'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.2/dist-packages/django/contrib/auth/models.py", line 8, in <module>
    from django.db import models
  File "/usr/local/lib/python3.2/dist-packages/django/db/__init__.py", line 11, in <module>
    if settings.DATABASES and DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 52, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 45, in _setup
    % (desc, ENVIRONMENT_VARIABLE))

django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, 
  but settings are not configured. You must either define the environment 
  variable DJANGO_SETTINGS_MODULE or call settings.configure() 
  before accessing settings.

¿Cómo podría configurarse incorrectamente, cuando funciona bien fuera del intérprete de Python? En mi configuración de Django, la DATABASESconfiguración es:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'django_db', # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'zamphatta',
        'PASSWORD': 'mypassword91',
        'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '', # Set to empty string for default.
    }
}

... ¿cómo se configura esto incorrectamente?

Zamphatta
fuente
Encontré esto al configurar un nuevo proyecto. Me pareció útil hacerlo unset DJANGO_SETTINGS_MODULE. Me encontraba con un problema en el que había configurado la variable var en mi .bashrc
fncomp

Respuestas:

264

No puedes simplemente iniciar Python y verificar cosas, Django no sabe en qué proyecto quieres trabajar. Tienes que hacer una de estas cosas:

  • Utilizar python manage.py shell
  • Uso django-admin.py shell --settings=mysite.settings(o cualquier módulo de configuración que use)
  • Establezca DJANGO_SETTINGS_MODULEla variable de entorno en su sistema operativo paramysite.settings
  • (Esto se elimina en Django 1.6) Uso setup_environen el intérprete de Python:

    from django.core.management import setup_environ
    from mysite import settings
    
    setup_environ(settings)
    

Naturalmente, la primera forma es la más fácil.

Pavel Anossov
fuente
¡Gracias! Eso no estaba del todo claro para mí en la documentación, o tal vez lo leí y lo olvidé cuando necesité hacerlo.
Zamphatta
66
Curiosamente, parece que no puede encontrar el archivo 'mysite.settings', pero puedo verlo allí mismo como mysite / settings.py. Ugh! Estoy empezando a odiar a Django.
Zamphatta
3
Sí, setup_environse elimina en 1.6, pero --settingsdebería funcionar. ¿Está seguro de que su configuración está más allá FirstBlog.settings, y no solo settingsen el directorio actual?
Pavel Anossov
21
Ninguno de los anteriores funcionó para mí, pero este sí:$ export DJANGO_SETTINGS_MODULE="my_project.settings"
Thumbz
22
En PyCharm, el lugar para hacerlo es Ejecutar | Editar configuraciones | (por ejemplo, pruebas unitarias en el proyecto) | Configuracion | Medio ambiente | Variables de entorno: DJANGO_SETTINGS_MODULE=(project directory name).settings
Bob Stein
41

En su shell de python / ipython haga:

from django.conf import settings

settings.configure()
Montaro
fuente
11
Apps aren't loaded yet.
Daniil Mashkin
26

En 2017 con django 1.11.5 y python 3.6 ( del comentario esto también funciona con Python 2.7 ):

import django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()

El .pyen el que pones este código debe estar en mysite(el padre)

MagTun
fuente
Muchas gracias, ninguna de las otras soluciones ha funcionado en mi caso
evnica
Trabaja también con python 2.7
Александр
Esto .pydebe colocarse en la raíz , lo que significa que está junto con manage.py. ¿Cómo lo coloco dentro de carpetas aleatorias?
anónimo
1
Cabe señalar que esto solo funcionará si lo coloca en la parte superior de su archivo, si lo coloca dentro de algo así if __name__ == "__main__":no funcionará correctamente :)
Josh Correia
11

En Django 1.9, intenté django-admin runservery obtuve el mismo error, pero cuando lo usé python manage.py runserverobtuve el resultado deseado. ¡Esto puede resolver este error para mucha gente!

Jacob Young
fuente
mismo, en django 1.10, pero al intentar ejecutar el comando loaddata
amchugh89
4

En mi caso, obtuve esto al intentar ejecutar pruebas de Django a través de PyCharm. Creo que es porque PyCharm no carga la configuración inicial del proyecto Django, es decir, las que se manage.py shellejecutan inicialmente. Uno puede agregarlos al inicio del script de prueba o simplemente ejecutar las pruebas usando manage.py test.

Versiones

  • Python 3.5 (en virtualenv)
  • PyCharm 2016.3.2 Profesional
  • Django 1.10
Deleet
fuente
3

en mi propio caso en django 1.10.1 ejecutándose en python2.7.11, estaba tratando de iniciar el servidor usando en django-admin runserverlugar de manage.py runserveren mi directorio de proyecto.

Dev
fuente
0

Para las personas que usan IntelliJ, con esta configuración pude consultar desde el shell (en Windows).

ingrese la descripción de la imagen aquí

Stef Van Looveren
fuente