web-dev-qa-db-fra.com

ImproperlyConfigured: vous devez soit définir la variable d'environnement Django_SETTINGS_MODULE, soit appeler settings.configure () avant d'accéder aux paramètres.

J'essayais de configurer mon Django à déployer sur heroku. Je reçois le message d'erreur suivant et je ne sais pas vraiment comment le réparer.

Voici le traceback complet et erreur:

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.

Voici mon wsgi.py fichier:

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

Et au cas où cela serait pertinent, mon fichier manage.py:

import os
import sys

    if __== "__main__":
        os.environ.setdefault("Django_SETTINGS_MODULE", "nirla.settings")

        from Django.core.management import execute_from_command_line

        execute_from_command_line(sys.argv)

Quelqu'un peut-il sembler comprendre le problème ici? Et si oui, pouvez-vous avoir la gentillesse d’expliquer ce qui ne va pas? Je vous remercie!

50
ApathyBear

J'ai pensé que le Django_SETTINGS_MODULE devait être réglé, alors j'ai regardé le documentation (lien mis à jour) et trouvé:

export Django_SETTINGS_MODULE=mysite.settings

Bien que cela ne soit pas suffisant si vous utilisez un serveur sur heroku, vous devez également le spécifier ici. Comme ça:

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

Dans mon cas spécifique, j'ai couru ces deux et tout a fonctionné:

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

Modifier

Je tiens également à souligner que vous devez répéter cette opération chaque fois que vous fermez ou redémarrez votre environnement virtuel. Au lieu de cela, vous devez automatiser le processus en accédant à venv/bin/activate et en ajoutant la ligne: set Django_SETTINGS_MODULE=mysite.settings au bas du code. À partir de maintenant, chaque fois que vous activerez l'environnement virtuel, vous utiliserez les paramètres de cette application.

62
ApathyBear

De Le Guide définitif sur Django: Le développement Web bien fait :

Si vous avez déjà utilisé Python auparavant, vous vous demandez peut-être pourquoi nous exécutons python manage.py Shell _ au lieu de python. Les deux commandes vont lancer l’interpréteur interactif, mais le manage.py Shell La commande présente une différence essentielle: avant de lancer l’interpréteur, elle indique à Django le fichier de paramètres à utiliser.

Cas d'utilisation: de nombreuses parties de Django, y compris le système de modèles, dépendent de vos paramètres. Vous ne pourrez pas les utiliser à moins que l'infrastructure ne sache quels paramètres utiliser.

Si vous êtes curieux, voici comment cela fonctionne en coulisse. Django recherche une variable d'environnement appelée Django_SETTINGS_MODULE, qui doit être défini sur le chemin d’importation de votre fichier settings.py. Par exemple, Django_SETTINGS_MODULE pourrait être réglé sur 'mysite.settings', en supposant que mysite se trouve sur votre chemin Python.

Quand vous courez python manage.py Shell, la commande prend soin de mettre Django_SETTINGS_MODULE pour vous.**

38
GrvTyagi

Django a besoin des paramètres spécifiques à votre application. Comme il est déjà dans votre manage.py juste. La solution plus rapide mais peut-être temporaire est ::

python manage.py Shell
19
AfamO

Créez un fichier . Env qui conservera vos informations d'identification à la racine de votre projet et le laissera en dehors de la gestion des versions:

$ echo ".env" >> .gitignore

Dans le fichier .env, ajoutez les variables (adaptez-les en fonction de votre installation):

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

Pour les utiliser, placez-le au-dessus de votre fichier de paramètres production.py:

import os

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

Publiez-le sur Heroku en utilisant cette gemme: http://github.com/ddollar/heroku-config.git

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

De cette façon, vous évitez de modifier les fichiers virtualenv.

* Basé sur ceci tutoriel

2
marcanuy