ImproperlyConfigured: вы должны либо определить переменную среды DJANGO_SETTINGS_MODULE, либо вызвать settings.configure () перед доступом к настройкам

89

Я пытался настроить свой проект django для развертывания на heroku. Я получаю следующую ошибку и не знаю, как ее исправить.

Вот полная трассировка и ошибка:

22:46:15 web.1  | Traceback (most recent call last):
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/arbiter.py", line 495, in spawn_worker
22:46:15 web.1  |     worker.init_process()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/workers/base.py", line 106, in init_process
22:46:15 web.1  |     self.wsgi = self.app.wsgi()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/base.py", line 114, in wsgi
22:46:15 web.1  |     self.callable = self.load()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 62, in load
22:46:15 web.1  |     return self.load_wsgiapp()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load_wsgiapp
22:46:15 web.1  |     return util.import_app(self.app_uri)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/util.py", line 354, in import_app
22:46:15 web.1  |     __import__(module)
22:46:15 web.1  |   File "/Users/nir/nirla/nirla/wsgi.py", line 12, in <module>
22:46:15 web.1  |     from dj_static import Cling
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/dj_static.py", line 7, in <module>
22:46:15 web.1  |     from django.contrib.staticfiles.handlers import StaticFilesHandler as DebugHandler
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 8, in <module>
22:46:15 web.1  |     from django.contrib.staticfiles.views import serve
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/contrib/staticfiles/views.py", line 13, in <module>
22:46:15 web.1  |     from django.views import static
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/views/static.py", line 96, in <module>
22:46:15 web.1  |     template_translatable = ugettext_noop("Index of %(directory)s")
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 65, in gettext_noop
22:46:15 web.1  |     return _trans.gettext_noop(message)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 52, in __getattr__
22:46:15 web.1  |     if settings.USE_I18N:
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 54, in __getattr__
22:46:15 web.1  |     self._setup(name)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 47, in _setup
22:46:15 web.1  |     % (desc, ENVIRONMENT_VARIABLE))
22:46:15 web.1  | ImproperlyConfigured: Requested setting USE_I18N, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

Вот мой файл wsgi.py :

import os
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings") #nirla is the name of the project


application = Cling(get_wsgi_application())

И если это было актуально, мой файл manage.py :

import os
import sys

    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")

        from django.core.management import execute_from_command_line

        execute_from_command_line(sys.argv)

Может ли кто-нибудь понять проблему здесь? И если да, не могли бы вы объяснить, что не так? Спасибо!

АпатияМедведь
источник

Ответы:

86

Я подумал, что DJANGO_SETTINGS_MODULE нужно каким-то образом настроить, поэтому я просмотрел документацию (ссылка обновлена) и обнаружила:

export DJANGO_SETTINGS_MODULE=mysite.settings

Хотя этого недостаточно, если вы запускаете сервер на heroku, вам также необходимо указать его там. Как это:

heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings --account <your account name> 

В моем конкретном случае я запустил эти два, и все сработало:

export DJANGO_SETTINGS_MODULE=nirla.settings
heroku config:set DJANGO_SETTINGS_MODULE=nirla.settings --account personal

редактировать

Я также хотел бы отметить, что вам придется делать это заново каждый раз, когда вы закрываете или перезапускаете виртуальную среду. Вместо этого вам следует автоматизировать процесс, перейдя в venv / bin / activate и добавив строку: set DJANGO_SETTINGS_MODULE=mysite.settingsв конец кода. С этого момента каждый раз, когда вы активируете виртуальную среду, вы будете использовать настройки этого приложения.

АпатияМедведь
источник
Так os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")игнорируется?
Matej J
67

Из Полного руководства по Django: правильная веб-разработка :

Если вы раньше использовали Python, вам может быть интересно, почему мы работаем, python manage.py shellа не просто python. Обе команды запускают интерактивный интерпретатор, но у manage.py shellкоманды есть одно ключевое отличие: перед запуском интерпретатора она сообщает Django, какой файл настроек использовать.

Пример использования: многие части Django, включая систему шаблонов, зависят от ваших настроек, и вы не сможете их использовать, если фреймворк не знает, какие настройки использовать.

Если вам интересно, вот как это работает за кулисами. Django ищет переменную окружения с именем DJANGO_SETTINGS_MODULE, в которой должен быть указан путь импорта вашего settings.py. Например, DJANGO_SETTINGS_MODULEможет быть установлено значение 'mysite.settings', если mysite находится на вашем пути Python.

При запуске python manage.py shellкоманда позаботится о настройке DJANGO_SETTINGS_MODULE. **

GrvTyagi
источник
2
Спасибо за это. Хотя оболочка django выдавала ту же ошибку, я в конце концов решил ее. Я нахожусь в частном случае, когда у меня settings.pyв базе кода нет файла / модуля, а есть settingsпакет / папка. Этот пакет содержит __init__.pyфайл со всем стандартным содержимым settings.py, а также другие файлы локальных настроек, импортированные в init . Поэтому мне пришлось настроить следующее:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
Fed Zee
Спасибо, ваш комментарий проливает свет. Я разрабатываю приложение на Django, и я разработал сценарий .py для загрузки данных из таблицы Excel в модель. В начале моего settings.py я добавил две предложенные вами строки, а именно: «from django.conf import settings», «settings.configure ()» .. Но когда я его запустил, моя консоль вернет «django.core. exceptions.AppRegistryNotReady: приложения еще не загружены », и я не могу понять почему. Вот мой скрипт stackoverflow.com/questions/58305225/…
Tms91
41

Django нужны настройки для вашего приложения. Поскольку он уже внутри вас manage.py, просто используйте его. Более быстрое, но, возможно, временное решение:

python manage.py shell
Афамо
источник
Это именно то, что мне нужно, когда я проходил обучение по Django 2.0 Tutorial - Part 5 - Automated testing . Раньше я входил в интерактивный режим Python в своей среде, набирая текст pythonсамостоятельно. Это приведет к исключению AppRegistryNotReady после ввода from polls.models import Question.
datalifenyc
спасибо, думал то django-admin shellже самое python manage.py shellно они разные.
Vishesh Mangla
9

В моем случае call_commandпроблема была связана с использованием модуля.
я добавилset DJANGO_SETTINGS_MODULE=mysite.settings но это не сработало.

Я наконец нашел это:

добавьте эти строки вверху скрипта, и порядок будет иметь значение.

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

import django
django.setup()

from django.core.management import call_command
Зорро
источник
3

Создайте файл .env, который будет содержать ваши учетные данные в корне вашего проекта и не использовать его для управления версиями:

$ echo ".env" >> .gitignore

В файле .env добавьте переменные (адаптируйте их в соответствии с вашей установкой):

$ echo "DJANGO_SETTINGS_MODULE=myproject.settings.production"> .env
#50 caracter random key
$ echo "SECRET_KEY='####'">> .env

Чтобы использовать их, поместите это поверх файла настроек production.py:

import os

env = os.environ.copy()
SECRET_KEY = env['SECRET_KEY']

Опубликуйте его в Heroku, используя этот гем: http://github.com/ddollar/heroku-config.git

$ heroku plugins:install git://github.com/ddollar/heroku-config.git
$ heroku config:push

Таким образом вы избегаете изменения файлов virtualenv.

* На основе этого руководства

Marcanuy
источник
1

Если вы используете локальный сервер, запустите оболочку Django, используя python manage.py shell. Это перенесет вас в среду Python Django, и все готово.

Арджун
источник
-1

Убедитесь, что путь python правильно указан в каталоге вашего проекта.

Тамкинатх Кунаин
источник