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

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

здесь полный traceback ошибка:

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)

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

5 ответов


Я понял, что 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 в нижней части кода. Отныне каждый раз, когда вы активируете виртуальную среду, вы будете использовать настройки приложения.


с окончательное руководство по Django: Веб-разработка сделано правильно:

Если вы использовали Python прежде, вы можете быть удивлены, почему мы бег!--6-->python manage.py Шелл!-Вместо -7--> просто python. Оба команды запустят интерактивный интерпретатор, ноmanage.py Шелл!-Команда -7--> имеет одно ключевое отличие: перед началом интерпретатор, он сообщает Django, какой файл настроек использовать.


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

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

"просто": при запуске python manage.py shell, команда заботится о настройке DJANGO_SETTINGS_MODULE для вас.
мы поощрение использования python manage.py shell в этих примерах так как чтобы минимизировать количество настроек и настройки, которые вы должны сделать.


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

python manage.py shell

создать .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.

*на основании этого учебник


используйте следующую команду:

python manage.py Шелл!--1-->

это автоматически устанавливает переменные среды django.