Błąd „Nieprawidłowo skonfigurowane” ustawienia Django DB

170

Django (1.5) działa dla mnie dobrze, ale kiedy uruchamiam interpreter Pythona (Python 3), aby sprawdzić niektóre rzeczy, pojawia się najdziwniejszy błąd, gdy próbuję importować - 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.

Jak można to nieprawidłowo skonfigurować, skoro działa dobrze poza interpreterem Pythona? W moich ustawieniach Django DATABASESsą następujące ustawienia:

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

... jak to jest nieprawidłowo skonfigurowane?

Zamphatta
źródło
Przeszedłem przez to podczas konfigurowania nowego projektu. Uważam, że to pomocne unset DJANGO_SETTINGS_MODULE.
Wystąpił problem polegający na tym, że ustawiłem zmienną

Odpowiedzi:

264

Nie możesz po prostu odpalić Pythona i sprawdzić rzeczy, Django nie wie, nad jakim projektem chcesz pracować. Musisz zrobić jedną z następujących rzeczy:

  • Posługiwać się python manage.py shell
  • Użyj django-admin.py shell --settings=mysite.settings(lub dowolnego modułu ustawień, którego używasz)
  • Ustaw DJANGO_SETTINGS_MODULEzmienną środowiskową w systemie operacyjnym namysite.settings
  • (Zostało to usunięte w Django 1.6) Użyj setup_environw interpreterze Pythona:

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

Oczywiście pierwszy sposób jest najłatwiejszy.

Pavel Anossov
źródło
Dzięki! Nie było to dla mnie jasne w dokumentacji, a może przeczytałem to i zapomniałem do czasu, gdy musiałem to zrobić.
Zamphatta
6
Co dziwne, nie można znaleźć pliku „mysite.settings”, ale widzę go tam jako mysite / settings.py. Fuj! Zaczynam nienawidzić Django.
Zamphatta
3
Tak, setup_environzostało usunięte w wersji 1.6, ale --settingspowinno działać. Czy jesteś pewien, że twoje ustawienia są dalej FirstBlog.settings, a nie tylko w settingsbieżącym katalogu?
Pavel Anossov
21
Żadne z powyższych nie zadziałało, ale ten $ export DJANGO_SETTINGS_MODULE="my_project.settings"
zadziałał
22
W PyCharm miejscem do tego jest Run | Edytuj konfiguracje | (np. Unittests w projekcie) | Konfiguracja | Środowisko | Zmienne środowiskowe: DJANGO_SETTINGS_MODULE=(project directory name).settings
Bob Stein
41

W swojej powłoce Pythona / ipython wykonaj:

from django.conf import settings

settings.configure()
Montaro
źródło
11
Apps aren't loaded yet.
Daniil Mashkin
26

W 2017 z django 1.11.5 i pythonem 3.6 ( z komentarza działa to również z Pythonem 2.7 ):

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

Kod, .pyw którym umieścisz ten kod, powinien znajdować się mysite(nadrzędny)

MagTun
źródło
Wielkie
Pracuj także z Pythonem 2.7
Александр
Ten .pypowinien być umieszczony na korzenia , co oznacza, że wraz z manage.py. Jak umieścić go w losowych folderach?
anonimowy
1
Należy zauważyć, że zadziała to tylko wtedy, gdy umieścisz go na początku pliku, jeśli umieścisz go w czymś takim if __name__ == "__main__":, jak to nie będzie działać poprawnie :)
Josh Correia
11

W Django 1.9 próbowałem django-admin runserveri otrzymałem ten sam błąd, ale kiedy użyłem python manage.py runserver, otrzymałem zamierzony wynik. To może rozwiązać ten błąd dla wielu ludzi!

Jacob Young
źródło
to samo, na django 1.10, ale podczas próby uruchomienia polecenia loaddata
amchugh89
4

W moim przypadku otrzymałem to, próbując uruchomić testy Django przez PyCharm. Myślę, że dzieje się tak, ponieważ PyCharm nie ładuje początkowych ustawień projektu Django, tj. Tych, które są manage.py shelluruchamiane początkowo. Można je dodać na początek skryptu testującego lub po prostu uruchomić testy za pomocą manage.py test.

Wersje:

  • Python 3.5 (w virtualenv)
  • PyCharm 2016.3.2 Professional
  • Django 1.10.0
Deleet
źródło
3

w moim przypadku w django 1.10.1 działającym na pythonie 2.7.11 próbowałem uruchomić serwer używając django-admin runserverzamiast manage.py runserverw katalogu mojego projektu.

Dev
źródło
0

Dla osób używających IntelliJ, przy tych ustawieniach mogłem zapytać z powłoki (w Windows).

wprowadź opis obrazu tutaj

Stef Van Looveren
źródło