Nieprawidłowo skonfigurowany: Musisz zdefiniować zmienną środowiskową DJANGO_SETTINGS_MODULE lub wywołać settings.configure () przed uzyskaniem dostępu do ustawień

88

Próbowałem skonfigurować mój projekt django do wdrożenia w heroku. Otrzymuję następujący błąd i tak naprawdę nie wiem, jak go naprawić.

Oto pełne śledzenie i błąd:

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.

Oto mój plik 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())

A gdyby to było istotne, mój plik 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)

Czy ktoś może zrozumieć ten problem? A jeśli tak, czy możesz być tak miły i wyjaśnić, co jest nie tak? Dziękuję Ci!

ApathyBear
źródło

Odpowiedzi:

86

Pomyślałem, że DJANGO_SETTINGS_MODULE trzeba w jakiś sposób ustawić, więc przejrzałem dokumentację (link zaktualizowany) i znalazłem:

export DJANGO_SETTINGS_MODULE=mysite.settings

Chociaż to nie wystarczy, jeśli uruchamiasz serwer na heroku, musisz to również określić. Lubię to:

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

W moim konkretnym przypadku uruchomiłem te dwa i wszystko się udało:

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

Edytować

Chciałbym również zaznaczyć, że musisz to zrobić ponownie za każdym razem, gdy zamykasz lub restartujesz swoje wirtualne środowisko. Zamiast tego powinieneś zautomatyzować ten proces, przechodząc do venv / bin /ivate i dodając wiersz: set DJANGO_SETTINGS_MODULE=mysite.settingsna dole kodu. Od teraz za każdym razem, gdy aktywujesz środowisko wirtualne, będziesz korzystać z ustawień tej aplikacji.

ApathyBear
źródło
Więc os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")jest ignorowany?
Matej J
67

Od ostatecznego przewodnika po Django: dobrze zrobione tworzenie stron internetowych :

Jeśli wcześniej korzystałeś z Pythona, możesz się zastanawiać, dlaczego działamy python manage.py shellzamiast tylko python. Oba polecenia uruchomią interaktywny interpreter, ale manage.py shellpolecenie ma jedną kluczową różnicę: przed uruchomieniem interpretera informuje Django, którego pliku ustawień ma użyć.

Przykład zastosowania: Wiele części Django, w tym system szablonów, polega na twoich ustawieniach i nie będziesz w stanie ich użyć, dopóki framework nie będzie wiedział, których ustawień użyć.

Jeśli jesteś ciekawy, oto jak to działa za kulisami. Django szuka zmiennej środowiskowej o nazwie DJANGO_SETTINGS_MODULE, która powinna być ustawiona na ścieżkę importu twojego settings.py. Na przykład DJANGO_SETTINGS_MODULEmoże być ustawione na 'mysite.settings', zakładając, że mysite znajduje się na Twojej ścieżce do Pythona.

Po uruchomieniu python manage.py shellpolecenie zajmie się ustawieniem DJANGO_SETTINGS_MODULEza Ciebie. **

GrvTyagi
źródło
2
Dziękuję za to. Chociaż powłoka django wyrzuciła ten sam błąd, w końcu go rozwiązałem. Jestem w szczególnym przypadku, w którym nie mam settings.pypliku / modułu w mojej bazie kodu, ale settingspakiet / folder. Ten pakiet zawiera __init__.pyplik ze wszystkimi typowymi elementami pliku settings.pyi innymi lokalnymi plikami ustawień, zaimportowanymi w programie init . Musiałem więc skonfigurować następująco:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
Fed Zee
Dzięki, twój komentarz jest pouczający. Tworzę aplikację w Django i opracowałem skrypt .py do przesyłania danych z arkusza Excela do modelu. Na początku mojego settings.py dodałem dwie linie, które zasugerowałeś, to znaczy „from django.conf import settings”, „settings.configure ()” .. Ale kiedy ją uruchamiam, moja konsola zwraca „django.core. wyjątki.AppRegistryNotReady: Aplikacje nie są jeszcze załadowane ”i nie rozumiem dlaczego. Oto mój stackoverflow.com/questions/58305225/ ...
Tms91
40

Django potrzebuje ustawień specyficznych dla aplikacji. Ponieważ jest już w twoim wnętrzu manage.py, po prostu go użyj. Szybszym, ale być może tymczasowym rozwiązaniem jest:

python manage.py shell
AfamO
źródło
To jest dokładnie to, czego potrzebowałem, kiedy przechodziłem przez samouczek Django 2.0 - Część 5 - Testowanie automatyczne . Wcześniej przechodziłem do trybu interaktywnego Pythona w moim środowisku, pisząc pythonsamodzielnie. Doprowadziłoby to do wyjątku AppRegistryNotReady po wpisaniu from polls.models import Question.
datalifenyc
9

W moim przypadku call_commandproblemem było użycie modułu.
Dodałem, set DJANGO_SETTINGS_MODULE=mysite.settingsale to nie zadziałało.

W końcu to znalazłem:

dodaj te wiersze u góry skryptu, a kolejność ma znaczenie.

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

import django
django.setup()

from django.core.management import call_command
Zorro
źródło
3

Utwórz plik .env , który będzie przechowywał Twoje poświadczenia w katalogu głównym projektu i pomiń go z wersjonowaniem:

$ echo ".env" >> .gitignore

W pliku .env dodaj zmienne (dostosuj je zgodnie z instalacją):

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

Aby z nich skorzystać, umieść to na górze pliku ustawień production.py:

import os

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

Opublikuj go w Heroku za pomocą tego klejnotu: http://github.com/ddollar/heroku-config.git

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

W ten sposób unikniesz zmiany plików virtualenv.

* Na podstawie tego samouczka

marcanuy
źródło
1

Jeśli korzystasz z serwera lokalnego, uruchom powłokę Django za pomocą python manage.py shell. Zabierze Cię do środowiska Pythona Django i możesz zacząć.

Arjjun
źródło
-1

Upewnij się, że ścieżka języka Python jest poprawnie ustawiona na katalog projektu.

Thamkinath Kounain
źródło