Неправильно Конфигурировано: вы должны либо определить переменную среды DJANGO_SETTINGS_MODULE, либо вызвать параметры settings.configure() перед доступом к настройкам
Я пытался настроить проект 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)
Может ли кто-нибудь понять эту проблему здесь? И если да, можете ли вы так любезны объяснить, что не так? Спасибо!
Ответы
Ответ 1
Я понял, что 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
в конец кода. С этого момента каждый раз, когда вы активируете виртуальную среду, вы будете использовать настройки этого приложения.
Ответ 2
Из окончательного руководства по 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
для вас. **
Ответ 3
Django нуждается в настройках вашего приложения. Так как это уже внутри вашего manage.py. Быстрое, но, возможно, временное решение:
python manage.py shell
Ответ 4
Создайте файл .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.
* Исходя из этого учебника