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.