web-dev-qa-db-fra.com

Django: ImproperlyConfigured: le paramètre SECRET_KEY ne doit pas être vide

J'essaie de configurer plusieurs fichiers de paramètres (développement, production, ..) incluant certains paramètres de base. Ne peut pas réussir cependant. Lorsque j'essaie d'exécuter ./manage.py runserver, j'obtiens le message d'erreur suivant:

(cb)clime@den /srv/www/cb $ ./manage.py runserver
ImproperlyConfigured: The SECRET_KEY setting must not be empty.

Voici mon module de configuration:

(cb)clime@den /srv/www/cb/cb/settings $ ll
total 24
-rw-rw-r--. 1 clime clime 8230 Oct  2 02:56 base.py
-rw-rw-r--. 1 clime clime  489 Oct  2 03:09 development.py
-rw-rw-r--. 1 clime clime   24 Oct  2 02:34 __init__.py
-rw-rw-r--. 1 clime clime  471 Oct  2 02:51 production.py

Paramètres de base (contiennent SECRET_KEY):

(cb)clime@den /srv/www/cb/cb/settings $ cat base.py:
# Django base settings for cb project.

import Django.conf.global_settings as defaults

DEBUG = False
TEMPLATE_DEBUG = False

INTERNAL_IPS = ('127.0.0.1',)

ADMINS = (
    ('clime', '[email protected]'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        #'ENGINE': 'Django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'Oracle'.
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'cwu',                   # Or path to database file if using sqlite3.
        'USER': 'clime',                 # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'Host': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'Europe/Prague'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = False

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = False # TODO: make this true and accustom date time input

DATE_INPUT_FORMATS = defaults.DATE_INPUT_FORMATS + ('%d %b %y', '%d %b, %y') # + ('25 Oct 13', '25 Oct, 13')

# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = '/srv/www/cb/media'

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/media/'

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = '/srv/www/cb/static'

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/Django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

# List of Finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'Django.contrib.staticfiles.finders.FileSystemFinder',
    'Django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'Django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = '8lu*6g0lg)9z!ba+a$ehk)xt)x%rxgb$i1&022shmi1jcgihb*'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'Django.template.loaders.filesystem.Loader',
    'Django.template.loaders.app_directories.Loader',
#     'Django.template.loaders.eggs.Loader',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    'Django.contrib.auth.context_processors.auth',
    'Django.core.context_processors.request',
    'Django.core.context_processors.debug',
    'Django.core.context_processors.i18n',
    'Django.core.context_processors.media',
    'Django.core.context_processors.static',
    'Django.core.context_processors.tz',
    'Django.contrib.messages.context_processors.messages',
    'web.context.inbox',
    'web.context.base',
    'web.context.main_search',
    'web.context.enums',
)

MIDDLEWARE_CLASSES = (
    'Django.middleware.common.CommonMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'watson.middleware.SearchContextMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'middleware.UserMemberMiddleware',
    'middleware.ProfilerMiddleware',
    'middleware.VaryOnAcceptMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'Django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'cb.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'cb.wsgi.application'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/Django_templates" or "C:/www/Django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    '/srv/www/cb/web/templates',
    '/srv/www/cb/templates',
)

INSTALLED_APPS = (
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.sites',
    'Django.contrib.messages',
    'Django.contrib.staticfiles',
    'south',
    'grappelli', # must be before admin
    'Django.contrib.admin',
    'Django.contrib.admindocs',
    'endless_pagination',
    'debug_toolbar',
    'djangoratings',
    'watson',
    'web',
)

AUTH_USER_MODEL = 'web.User'

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'Django.utils.log.RequireDebugFalse'
        }
    },
    'formatters': {
        'standard': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'Django.utils.log.AdminEmailHandler'
        },
        'null': {
            'level':'DEBUG',
            'class':'Django.utils.log.NullHandler',
        },
        'logfile': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': "/srv/www/cb/logs/application.log",
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console':{
            'level':'INFO',
            'class':'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'Django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'Django': {
            'handlers':['console'],
            'propagate': True,
            'level':'WARN',
        },
        'Django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'web': {
            'handlers': ['console', 'logfile'],
            'level': 'DEBUG',
        },
    },
}

LOGIN_URL = 'login'
LOGOUT_URL = 'logout'

#ENDLESS_PAGINATION_LOADING = """
#    <img src="/static/web/img/preloader.gif" alt="loading" style="margin:auto"/>
#"""
ENDLESS_PAGINATION_LOADING = """
    <div class="spinner small" style="margin:auto">
        <div class="block_1 spinner_block small"></div>
        <div class="block_2 spinner_block small"></div>
        <div class="block_3 spinner_block small"></div>
    </div>
"""

DEBUG_TOOLBAR_CONFIG = {
    'INTERCEPT_REDIRECTS': False,
}

import Django.template.loader
Django.template.loader.add_to_builtins('web.templatetags.cb_tags')
Django.template.loader.add_to_builtins('web.templatetags.tag_library')

WATSON_POSTGRESQL_SEARCH_CONFIG = 'public.english_nostop'

Un des fichiers de paramétrage:

(cb)clime@den /srv/www/cb/cb/settings $ cat development.py 
from base import *

DEBUG = True
TEMPLATE_DEBUG = True

ALLOWED_HOSTS = ['127.0.0.1', '31.31.78.149']

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'cwu',
        'USER': 'clime',
        'PASSWORD': '',
        'Host': '',
        'PORT': '',
    }
}

MEDIA_ROOT = '/srv/www/cb/media/'

STATIC_ROOT = '/srv/www/cb/static/'

TEMPLATE_DIRS = (
    '/srv/www/cb/web/templates',
    '/srv/www/cb/templates',
)

Code en manage.py:

(cb)clime@den /srv/www/cb $ cat manage.py 
#!/usr/bin/env python
import os
import sys

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

    from Django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Si j'ajoute from base import * dans /srv/www/cb/cb/settings/__init__.py (qui est par ailleurs vide), cela commence magiquement à fonctionner mais je ne comprends pas pourquoi. Quelqu'un pourrait-il m'expliquer ce qui se passe ici? Ce doit être une magie de module python.

EDIT: Tout commence également à fonctionner si je supprime cette ligne de base.py

Django.template.loader.add_to_builtins('web.templatetags.cb_tags')

Si je supprime cette ligne de web.templatetags.cb_tags, cela commence également à fonctionner:

from endless_pagination.templatetags import endless

Je suppose que c’est parce qu’en fin de compte, cela conduit à 

from Django.conf import settings
PER_PAGE = getattr(settings, 'ENDLESS_PAGINATION_PER_PAGE', 10)

Cela crée donc des trucs étranges circulaires et une fin de partie.

71
clime

J'ai eu la même erreur et il s'est avéré être une dépendance circulaire entre un module ou une classe chargée par les paramètres et le module de paramètres lui-même. Dans mon cas, c’était une classe de middleware nommée dans les paramètres qui essayait elle-même de charger les paramètres.

J'ai rencontré le même problème après avoir restructuré les paramètres conformément aux instructions du livre de Daniel Greenfield Two scoops of Django .

J'ai résolu le problème en mettant 

os.environ.setdefault("Django_SETTINGS_MODULE", "project_name.settings.local")

dans manage.py et wsgi.py.

53
Jinesh

J'ai eu la même erreur avec python manage.py runserver.

Pour moi, il s’est avéré que c’était à cause d’un fichier binaire compilé (.pyc). Après avoir supprimé tous ces fichiers de mon projet, le serveur a repris son exécution. :)

Donc, si vous obtenez cette erreur, de nulle part, c'est-à-dire sans apporter de modification apparemment liée aux paramètres de Django, cela pourrait être une bonne première mesure.

17
akshay

Supprimer les fichiers .pyc

Commande de terminal Ubuntu pour supprimer .pyc: find . -name "*.pyc" -exec rm -rf {} \;

J'ai eu la même erreur quand j'ai fait le serveur python manage.py. C'était parce que le fichier .pyc. J'ai supprimé le fichier .pyc du répertoire du projet, puis il fonctionnait.

11
Aslam Khan

Je n'avais pas spécifié le fichier de paramètres:

python manage.py runserver --settings=my_project.settings.develop
5
maugsburger

Il commence à fonctionner car sur le fichier base.py, vous avez toutes les informations nécessaires dans un fichier de paramètres de base. Vous avez besoin de la ligne:

SECRET_KEY = '8lu*6g0lg)9z!ba+a$ehk)xt)x%rxgb$i1&amp;022shmi1jcgihb*'

Donc ça marche et quand vous faites from base import *, il importe SECRET_KEY dans votre development.py.

Vous devez toujours importer les paramètres de base avant de définir des paramètres personnalisés.


EDIT: En outre, lorsque Django importe le développement de votre paquet, il initialise toutes les variables de la base puisque vous avez défini from base import * dans __init__.py

Je pense que c’est le Erreur d’environnement , vous devriez essayer de régler: Django_SETTINGS_MODULE='correctly_settings'

5
吾慎行

J'ai eu le même problème avec le céleri. Mon setting.py before:

SECRET_KEY = os.environ.get('Django_SECRET_KEY')

après:

SECRET_KEY = os.environ.get('Django_SECRET_KEY', <YOUR developing key>)

Si les variables d'environnement ne sont pas définies, alors: SECRET_KEY =VOTRE clé en développement

2
MrNinjamannn

J'ai résolu ce problème sur OS X avec Django 1.5 et 1.6 en désactivant toutes les sessions actives sur virtualenv et en le redémarrant.

2
andilabs

Pour toute personne utilisant PyCharm: le bouton vert "Exécuter la configuration sélectionnée" produirait l'erreur tandis que l'exécution de py manage.py runserver 127.0.0.1:8000 --settings=app_name.settings.development fonctionnerait. 

Pour résoudre ce problème, vous devez modifier les variables d'environnement de la configuration. Pour ce faire, cliquez sur le menu déroulant "Sélectionner la configuration d'exécution/de débogage" à gauche du bouton vert d'exécution, puis cliquez sur "modifier la configuration". Sous l'onglet "environnement", remplacez la variable d'environnement Django_SETTINGS_MODULE par app_name.settings.development.

1
Jamie Williams

Je voulais juste ajouter que j'ai eu cette erreur lorsque mon nom de base de données était mal orthographié dans mon fichier settings.py afin que la base de données ne puisse pas être créée.

1
Lexo

Dans le répertoire init . Py du répertoire de paramètres, écrivez la bonne importation, comme suit:

from Project.settings.base import *

Pas besoin de changer wsgi.py ou manage.py

1
cwhisperer

J'ai résolu ce problème sur 1.8.4 en corrigeant les paramètres TEMPLATES qui avaient une faute de frappe (la suppression de TEMPLATES ['debug'] l'a résolue)

Passez en revue les paramètres que vous avez modifiés récemment et assurez-vous que toutes les clés sont en règle.

1
oriadam

J'ai résolu ce problème en supprimant les espaces autour des signes égaux (=) dans mon fichier .env.

0
Aiven

Pour ajouter une autre solution potentielle au mélange, j'avais un dossier settings ainsi qu'un settings.py dans mon répertoire de projet. (Je revenais des fichiers de paramètres basés sur l'environnement vers un fichier. J'ai depuis reconsidéré.)

Python commençait à me demander si je voulais importer project/settings.py ou project/settings/__init__.py. J'ai supprimé le répertoire settings et tout fonctionne maintenant correctement.

0
Brendan Quinn

Mon Mac OS n'aimait pas qu'il ne trouve pas la variable env définie dans le fichier de paramètres:

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('MY_SERVER_ENV_VAR_NAME')

mais après avoir ajouté la variable env à mon environnement de développement Mac OS local, l'erreur a disparu:

export MY_SERVER_ENV_VAR_NAME ='fake dev security key that is longer than 50 characters.'

Dans mon cas, j'avais également besoin d'ajouter le paramètre --settings:

python3 manage.py check --deploy --settings myappname.settings.production

où production.py est un fichier contenant des paramètres spécifiques à la production dans un dossier de paramètres.

0
Samer s Salib

Le problème pour moi était d’appeler get_text_noop dans l’itéré des langues.

En changeant

LANGUAGES = (
    ('en-gb', get_text_noop('British English')),
    ('fr', get_text_noop('French')),
)

à

from Django.utils.translation import gettext_lazy as _

LANGUAGES = (
    ('en-gb', _('British English')),
    ('fr', _('French')),
)

dans le fichier de paramètres de base a résolu l’exception ImproperlyConfigured: The SECRET_KEY setting must not be empty.

0
Sepia

Dans mon cas, le problème était - j'avais mon app_folder et mon settings.py dedans. Ensuite, j'ai décidé de créer Settings folder dans app_folder - ce qui a provoqué une collision avec settings.py. Il suffit de renommer ce Settings folder - et tout a fonctionné.

0
Chiefir