Configurado incorrectamente: debe definir la variable de entorno DJANGO_SETTINGS_MODULE o llamar a settings.configure () antes de acceder a la configuración

83

Estaba tratando de configurar mi proyecto django para implementarlo en heroku. Recibo el siguiente error y realmente no sé cómo solucionarlo.

Aquí está el rastreo completo y el error:

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.

Aquí está mi archivo 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())

Y en caso de que fuera relevante, mi archivo 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)

¿Alguien parece entender el problema aquí? Y si es así, ¿puede ser tan amable de explicar qué está mal? ¡Gracias!

ApatíaOso
fuente

Respuestas:

82

Pensé que DJANGO_SETTINGS_MODULE tenía que configurarse de alguna manera, así que miré la documentación (enlace actualizado) y encontré:

export DJANGO_SETTINGS_MODULE=mysite.settings

Aunque eso no es suficiente si está ejecutando un servidor en heroku, también debe especificarlo allí. Me gusta esto:

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

En mi caso específico, ejecuté estos dos y todo funcionó:

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

Editar

También me gustaría señalar que debe volver a hacer esto cada vez que cierre o reinicie su entorno virtual. En su lugar, debe automatizar el proceso yendo a venv / bin / active y agregando la línea: set DJANGO_SETTINGS_MODULE=mysite.settingsal final del código. A partir de ahora, cada vez que active el entorno virtual, utilizará la configuración de esa aplicación.

ApatíaOso
fuente
Entonces, ¿ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")se ignora?
Matej J
62

De la guía definitiva de Django: desarrollo web bien hecho :

Si ha usado Python antes, es posible que se pregunte por qué estamos ejecutando en python manage.py shelllugar de solo python. Ambos comandos iniciarán el intérprete interactivo, pero el manage.py shellcomando tiene una diferencia clave: antes de iniciar el intérprete, le dice a Django qué archivo de configuración usar.

Caso de uso: muchas partes de Django, incluido el sistema de plantillas, dependen de su configuración y no podrá usarlas a menos que el marco sepa qué configuración usar.

Si tiene curiosidad, así es como funciona entre bastidores. Django busca una variable de entorno llamada DJANGO_SETTINGS_MODULE, que debe establecerse en la ruta de importación de su settings.py. Por ejemplo, DJANGO_SETTINGS_MODULEpodría estar configurado en 'mysite.settings', asumiendo que mysite está en su ruta de Python.

Cuando corres python manage.py shell, el comando se encarga de configurarlo DJANGO_SETTINGS_MODULEpor ti. **

GrvTyagi
fuente
2
Gracias por eso. Aunque el shell de django arrojó el mismo error, finalmente lo resolví. Estoy en un caso particular, en el que no tengo un settings.pyarchivo / módulo en mi base de código, sino un settingspaquete / carpeta. Este paquete contiene un __init__.pyarchivo con todo el material convencional del settings.pyy otros archivos de configuración local, importados en init . Así que tuve que configurarlo de la siguiente manera:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
Fed Zee
Gracias, tu comentario es esclarecedor. Estoy desarrollando una aplicación en Django y desarrollé un script .py para cargar datos desde una hoja de Excel en el modelo. Al principio de mi settings.py agregué las dos líneas que sugirió, que son "from django.conf import settings", "settings.configure ()" .. Pero mientras lo ejecuto, mi consola devuelve “django.core. exceptions.AppRegistryNotReady: Las aplicaciones aún no se han cargado ”, y no puedo entender por qué. Aquí está mi script stackoverflow.com/questions/58305225/…
Tms91
38

Django necesita la configuración específica de su aplicación. Como ya está dentro de ti manage.py, solo úsala. La solución más rápida, pero quizás temporal, es:

python manage.py shell
AfamO
fuente
Esto es exactamente lo que necesitaba cuando estaba pasando por el Tutorial de Django 2.0 - Parte 5 - Pruebas automatizadas . Anteriormente, ingresé al modo interactivo de Python dentro de mi entorno escribiendo pythonsolo. Esto conduciría a una excepción AppRegistryNotReady después de escribir from polls.models import Question.
datalifenyc
6

En mi caso fue el uso del call_commandmódulo lo que planteó un problema.
Agregué set DJANGO_SETTINGS_MODULE=mysite.settingspero no funcionó.

Finalmente lo encontré:

agregue estas líneas en la parte superior del guión, y el orden es importante.

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

import django
django.setup()

from django.core.management import call_command
Zorro
fuente
3

Cree un archivo .env que mantendrá sus credenciales en la raíz de su proyecto y déjelo fuera del control de versiones:

$ echo ".env" >> .gitignore

En el archivo .env, agregue las variables (adáptelas según su instalación):

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

Para usarlos, coloque esto encima de su archivo de configuración production.py:

import os

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

Publíquelo en Heroku usando esta gema: http://github.com/ddollar/heroku-config.git

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

De esta forma evita cambiar archivos virtualenv.

* Basado en este tutorial

marcanuy
fuente
0

Si está usando el servidor local, ejecute Django shell usando python manage.py shell. Lo llevará al entorno de Python de Django y estará listo para comenzar.

Arjjun
fuente
0

Asegúrese de que la ruta de Python esté configurada correctamente en el directorio de su proyecto.

Thamkinath Kounain
fuente