Ошибка неверной настройки параметров Django DB

170

Django (1.5) работает хорошо для меня, но когда я запускаю интерпретатор Python (Python 3), чтобы проверить некоторые вещи, я получаю самую странную ошибку, когда пытаюсь импортировать - 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.

Как это может быть неправильно настроено, когда он отлично работает вне интерпретатора Python? В моих настройках Django, DATABASESнастройки:

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

... как это неправильно настроено?

Zamphatta
источник
Наткнулся на это при настройке нового проекта. Я нашел это полезным сделать unset DJANGO_SETTINGS_MODULE. Я столкнулся с проблемой, когда я установил env var в моем .bashrc
fncomp

Ответы:

264

Вы не можете просто запустить Python и проверить вещи, Django не знает, над каким проектом вы хотите работать. Вы должны сделать одну из следующих вещей:

  • использование python manage.py shell
  • Используйте django-admin.py shell --settings=mysite.settings(или любой другой модуль настроек, который вы используете)
  • Установите DJANGO_SETTINGS_MODULEпеременную среды в вашей ОС наmysite.settings
  • (Это удалено в Django 1.6). Используйте setup_environв интерпретаторе python:

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

Естественно, первый способ самый простой.

Павел Аносов
источник
Спасибо! Это было не совсем ясно для меня в документации, или, может быть, я прочитал это и забыл, когда мне нужно было это сделать.
Замфатта
6
Как ни странно, он не может найти файл «mysite.settings», но я вижу, что он находится прямо там, как mysite / settings.py. Тьфу! Я начинаю ненавидеть Джанго.
Замфатта
3
Да, setup_environудаляется в 1.6, но --settingsдолжно работать. Вы уверены, что ваши настройки находятся дальше FirstBlog.settings, а не только в settingsтекущем каталоге?
Павел Аносов
21
Ничто из вышеперечисленного не сработало для меня, но это $ export DJANGO_SETTINGS_MODULE="my_project.settings"
сработало
22
В PyCharm это можно сделать с помощью Run | Редактировать конфигурации | (например, Unittests в проекте) | Конфигурация | Окружающая среда | Переменные среды: DJANGO_SETTINGS_MODULE=(project directory name).settings
Боб Стейн
41

В вашей оболочке python / ipython выполните:

from django.conf import settings

settings.configure()
Montaro
источник
11
Apps aren't loaded yet.
Даниил Машкин
26

В 2017 году с django 1.11.5 и python 3.6 ( из комментария это также работает с Python 2.7 ):

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

В .pyкотором вы должны поместить этот код mysite(родительский)

MagTun
источник
Большое спасибо, ни одно из других решений не сработало в моем случае
evnica
Работать с Python 2.7 тоже
Александр
Это .pyдолжно быть помещено в корень , что означает, что это наряду с manage.py. Как мне поместить его в случайные папки?
анонимно
1
Следует отметить, что это будет работать только в том случае, если вы поместите его в верхнюю часть файла, если вы поместите его в нечто вроде того, что if __name__ == "__main__":оно не будет работать правильно :)
Джош Коррейя,
11

На Django 1.9 я попробовал django-admin runserverи получил ту же ошибку, но когда я использовал, python manage.py runserverя получил ожидаемый результат. Это может решить эту ошибку для многих людей!

Джейкоб Янг
источник
то же самое, на django 1.10, но при попытке запустить команду loaddata
amchugh89
4

В моем случае я получил это при попытке запустить тесты Django через PyCharm. Я думаю, это потому, что PyCharm не загружает исходные настройки проекта Django, то есть те, которые manage.py shellзапускаются изначально. Можно добавить их в начало скрипта тестирования или просто запустить тесты, используя manage.py test.

Версии:

  • Python 3.5 (в виртуаленв)
  • PyCharm 2016.3.2 Professional
  • Джанго 1.10
Deleet
источник
3

в моем собственном случае в django 1.10.1, работающем на python2.7.11, я пытался запустить сервер, используя django-admin runserverвместо manage.py runserverмоего каталога проекта.

Dev
источник
0

Для людей, использующих IntelliJ, с этими настройками я смог сделать запрос из оболочки (на окнах).

введите описание изображения здесь

Стеф Ван Луверен
источник