Unsachgemäß konfiguriert: Sie müssen entweder die Umgebungsvariable DJANGO_SETTINGS_MODULE definieren oder settings.configure () aufrufen, bevor Sie auf Einstellungen zugreifen können

83

Ich habe versucht, mein Django-Projekt für die Bereitstellung auf Heroku zu konfigurieren. Ich erhalte den folgenden Fehler und weiß nicht wirklich, wie ich ihn beheben soll.

Hier ist der vollständige Traceback und Fehler:

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.

Hier ist meine wsgi.py- Datei:

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())

Und falls es relevant war, meine manage.py- Datei:

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)

Kann jemand das Problem hier zu verstehen scheinen? Und wenn ja, können Sie so freundlich sein, zu erklären, was falsch ist? Vielen Dank!

ApathyBear
quelle

Antworten:

82

Ich dachte mir, dass das DJANGO_SETTINGS_MODULE irgendwie eingestellt werden musste, also schaute ich mir die Dokumentation an (Link aktualisiert) und fand:

export DJANGO_SETTINGS_MODULE=mysite.settings

Obwohl dies nicht ausreicht, wenn Sie einen Server auf Heroku ausführen, müssen Sie ihn auch dort angeben. So was:

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

In meinem speziellen Fall habe ich diese beiden ausgeführt und alles hat geklappt:

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

Bearbeiten

Ich möchte auch darauf hinweisen, dass Sie dies jedes Mal wiederholen müssen, wenn Sie Ihre virtuelle Umgebung schließen oder neu starten. Stattdessen sollten Sie den Prozess automatisieren, indem Sie zu venv / bin / enabled gehen und die Zeile hinzufügen: set DJANGO_SETTINGS_MODULE=mysite.settingsam Ende des Codes. Von nun an verwenden Sie jedes Mal, wenn Sie die virtuelle Umgebung aktivieren, die Einstellungen dieser App.

ApathyBear
quelle
Wird os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")also ignoriert?
Matej J
62

Vom endgültigen Leitfaden zu Django: Webentwicklung richtig gemacht :

Wenn Sie Python bereits verwendet haben, fragen Sie sich möglicherweise, warum wir python manage.py shellstatt nur ausgeführt werden python. Beide Befehle starten den interaktiven Interpreter, aber der manage.py shellBefehl weist einen wesentlichen Unterschied auf: Bevor der Interpreter gestartet wird , teilt er Django mit, welche Einstellungsdatei verwendet werden soll.

Anwendungsfall: Viele Teile von Django, einschließlich des Vorlagensystems, hängen von Ihren Einstellungen ab, und Sie können sie nur verwenden, wenn das Framework weiß, welche Einstellungen verwendet werden sollen.

Wenn Sie neugierig sind, erfahren Sie hier, wie es hinter den Kulissen funktioniert. Django sucht nach einer Umgebungsvariablen namens DJANGO_SETTINGS_MODULE, die auf den Importpfad Ihrer settings.py gesetzt werden sollte. Beispielsweise DJANGO_SETTINGS_MODULEkönnte festgelegt werden 'mysite.settings', unter der Annahme , mysite auf Ihrem Python - Pfad ist.

Wenn Sie ausführen python manage.py shell, übernimmt der Befehl die Einstellung DJANGO_SETTINGS_MODULEfür Sie. **

GrvTyagi
quelle
2
Dank dafür. Obwohl die Django-Shell den gleichen Fehler verursachte, löste ich das schließlich. Ich bin in einem bestimmten Fall, in dem ich keine settings.pyDatei / kein Modul in meiner Codebasis habe, sondern ein settingsPaket / einen Ordner. Dieses Paket enthält eine __init__.pyDatei mit allen herkömmlichen Inhalten der settings.pyund anderer lokaler Einstellungsdateien, die in init importiert wurden . Also musste ich wie folgt konfigurieren:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
Fed Zee
Danke, dein Kommentar ist aufschlussreich. Ich entwickle eine App in Django und habe ein .py-Skript entwickelt, um Daten von einer Excel-Tabelle in das Modell hochzuladen. Zu Beginn meiner settings.py habe ich die beiden von Ihnen vorgeschlagenen Zeilen hinzugefügt, nämlich "from django.conf import settings", "settings.configure ()". Während ich sie ausführe, gibt meine Konsole "django.core" zurück. Ausnahmen.AppRegistryNotReady: Apps sind noch nicht geladen “, und ich kann nicht verstehen, warum. Hier ist mein Skript stackoverflow.com/questions/58305225/…
Tms91
38

Django benötigt Ihre anwendungsspezifischen Einstellungen. Da es sich bereits in Ihrem befindet manage.py, verwenden Sie es einfach. Die schnellere, aber möglicherweise vorübergehende Lösung lautet:

python manage.py shell
AfamO
quelle
Dies ist genau das, was ich brauchte, als ich das Django 2.0-Tutorial - Teil 5 - Automatisiertes Testen durchlief . Zuvor habe ich den interaktiven Python-Modus in meiner Umgebung durch pythonalleiniges Tippen aufgerufen. Dies würde nach der Eingabe zu einer AppRegistryNotReady-Ausnahme führen from polls.models import Question.
datalifenyc
6

In meinem Fall war es die Verwendung des call_commandModuls, die ein Problem darstellte.
Ich fügte hinzu, set DJANGO_SETTINGS_MODULE=mysite.settingsaber es hat nicht funktioniert.

Ich habe es endlich gefunden:

Fügen Sie diese Zeilen oben im Skript hinzu, und die Reihenfolge ist wichtig.

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

import django
django.setup()

from django.core.management import call_command
Zorro
quelle
3

Erstellen Sie eine ENV- Datei, in der Ihre Anmeldeinformationen im Stammverzeichnis Ihres Projekts gespeichert sind, und lassen Sie die Versionsverwaltung aus:

$ echo ".env" >> .gitignore

Fügen Sie in der .env-Datei die Variablen hinzu (passen Sie sie entsprechend Ihrer Installation an):

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

Um sie zu verwenden, fügen Sie dies oben in Ihre Einstellungsdatei Production.py ein:

import os

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

Veröffentlichen Sie es in Heroku mit diesem Juwel: http://github.com/ddollar/heroku-config.git

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

Auf diese Weise vermeiden Sie das Ändern von virtualenv-Dateien.

* Basierend auf diesem Tutorial

marcanuy
quelle
0

Wenn Sie den lokalen Server verwenden, führen Sie die Django-Shell mit aus python manage.py shell. Sie gelangen in die Django-Python-Umgebung und können loslegen.

Arjjun
quelle
0

Stellen Sie sicher, dass der Python-Pfad korrekt auf Ihr Projektverzeichnis eingestellt ist.

Thamkinath Kounain
quelle