Erro 'incorretamente configurado' das configurações do DB Django


170

O Django (1.5) está funcionando bem para mim, mas quando ligo o interpretador Python (Python 3) para verificar algumas coisas, recebo o erro mais estranho ao tentar 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.

Como ele pode ser configurado incorretamente, quando funciona bem fora do interpretador Python? Nas minhas configurações do Django, as DATABASESconfigurações são:

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.
    }
}

... como isso é configurado incorretamente?


Me deparei com isso ao configurar um novo projeto. Achei útil fazer isso unset DJANGO_SETTINGS_MODULE. Eu estava correndo em um problema onde eu tinha fixado o env var no meu .bashrc
fncomp

Respostas:


264

Você não pode simplesmente iniciar o Python e verificar as coisas, o Django não sabe em qual projeto você deseja trabalhar. Você precisa fazer uma destas coisas:

  • Usar python manage.py shell
  • Use django-admin.py shell --settings=mysite.settings(ou qualquer módulo de configuração que você use)
  • Defina DJANGO_SETTINGS_MODULEa variável de ambiente no seu sistema operacional comomysite.settings
  • (Isso é removido no Django 1.6) Use setup_environno interpretador python:

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

Naturalmente, a primeira maneira é a mais fácil.


Obrigado! Isso não estava muito claro para mim na documentação, ou talvez eu tenha lido e esquecido quando precisei fazê-lo.
Zamphatta

6
Estranhamente, parece que não consigo encontrar o arquivo 'mysite.settings', mas posso vê-lo ali como mysite / settings.py. Ugh! Estou começando a odiar o Django.
Zamphatta

3
Sim, setup_environé removido no 1.6, mas --settingsdeve funcionar. Você tem certeza de que suas configurações estão mais avançadas FirstBlog.settings, e não apenas no settingsdiretório atual?
Pavel Anossov 15/02/2014

21
Nenhuma das opções acima funcionou para mim, mas este fez:$ export DJANGO_SETTINGS_MODULE="my_project.settings"
Thumbz

22
No PyCharm, o lugar para fazer isso é Executar | Editar configurações | (por exemplo, unittests no projeto) | Configuração | Ambiente | As variáveis de ambiente: DJANGO_SETTINGS_MODULE=(project directory name).settings
Bob Stein

41

No seu shell python / ipython, faça:

from django.conf import settings

settings.configure()

11
Apps aren't loaded yet.
Daniil Mashkin

26

Em 2017 com o django 1.11.5 e python 3.6 (a partir do comentário, isso também funciona com o Python 2.7 ):

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

O .pycódigo em que você coloca esse código mysite(o principal)


Muito obrigado, nenhuma das outras soluções têm trabalhado no meu caso
evnica

Trabalhar com python 2.7 também
Александр

Isso .pydeve ser colocado na raiz , o que significa que está junto com o manage.py. Como o coloco dentro de pastas aleatórias?
anônimo

1
Note-se que isso só funcionará se você colocá-lo na parte superior do seu arquivo, se você colocá-lo dentro de algo como if __name__ == "__main__":se não funcionasse corretamente :)
Josh Correia

11

No Django 1.9, tentei django-admin runservere obtive o mesmo erro, mas quando o usei python manage.py runserver, obtive o resultado pretendido. Isso pode resolver esse erro para muitas pessoas!


mesmo, em Django 1.10, mas ao tentar executar o comando loaddata
amchugh89

4

No meu caso, consegui isso ao tentar executar testes do Django através do PyCharm. Eu acho que é porque o PyCharm não carrega as configurações iniciais do projeto Django, ou seja, aquelas que são manage.py shellexecutadas inicialmente. Pode-se adicioná-los ao início do script de teste ou apenas executar os testes usando manage.py test.

Versões:

  • Python 3.5 (em virtualenv)
  • PyCharm 2016.3.2 Professional
  • Django 1.10

3

no meu próprio caso no django 1.10.1 em execução no python2.7.11, eu estava tentando iniciar o servidor usando, em django-admin runservervez de manage.py runserverno meu diretório do projeto.


0

Para as pessoas que usam o IntelliJ, com essas configurações, fui capaz de consultar a partir do shell (no Windows).

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.