Неправильно налаштовано: перед доступом до налаштувань потрібно або визначити змінну середовища DJANGO_SETTINGS_MODULE, або викликати settings.configure ().


90

Я намагався налаштувати свій проект 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)

Хтось, здається, розуміє проблему тут? І якщо так, то чи можете ви бути такими добрими, щоб пояснити, що не так? Дякую!

Відповіді:


87

Я зрозумів, що 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

68

З Остаточного посібника до 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для вас. **


2
Дякую за це. Хоча оболонка django видала ту саму помилку, я врешті вирішив це. Я перебуваю в конкретному випадку, коли settings.pyв моїй базі коду є не файл / модуль, а settingsпакет / папка. Цей пакет містить __init__.pyфайл із усіма звичайними settings.pyфайлами та іншими локальними файлами налаштувань, імпортованими в init . Тож мені довелося налаштувати так:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
Fed Zee

Дякую, ваш коментар висвітлює. Я розробляю програму в Django, і я розробив скрипт .py для завантаження даних із аркуша Excel у модель. На початку мого settings.py я додав два рядки, які ви запропонували, тобто "з налаштувань імпорту django.conf", "settings.configure ()" .. Але під час запуску моя консоль повертає “django.core. винятки.AppRegistryNotReady: Програми ще не завантажені ”, і я не можу зрозуміти, чому. Ось мій сценарій stackoverflow.com/questions/58305225 / ...
Tms91

42

Django потребує налаштувань, специфічних для вашої програми. Оскільки це вже всередині вашого manage.py, просто використовуйте це. Швидшим, але, можливо, тимчасовим рішенням є:

python manage.py shell

Це саме те, що мені потрібно було, коли я проходив підручник з Django 2.0 - Частина 5 - Автоматизоване тестування . Раніше я переходив до інтерактивного режиму Python у своєму середовищі, натискаючи pythonодин. Це призведе до винятку AppRegistryNotReady після введення тексту from polls.models import Question.
datalifenyc

дякую, я думав, django-admin shellце те саме, що, python manage.py shellале вони різні.
Вішеш Мангла

10

У моєму випадку саме використання 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.

* На основі цього підручника


1

Якщо ви використовуєте локальний сервер, запустіть оболонку Django за допомогою python manage.py shell. Це перенесе вас у середовище пітону Django, і ви готові піти.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.