Django: ImproperlyConfigured: La configuración SECRET_KEY no debe estar vacía

100

Estoy intentando configurar varios archivos de configuración (desarrollo, producción, ..) que incluyen algunas configuraciones básicas. Aunque no puedo tener éxito. Cuando intento ejecutar ./manage.py runserver, aparece el siguiente error:

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

Aquí está mi módulo de configuración:

(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

Configuración básica (contiene 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'

Uno de los archivos de configuración:

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

Código en manage.py:

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

if __name__ == "__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 añado from base import *en /srv/www/cb/cb/settings/__init__.py(que está por lo demás vacío), que mágicamente comienza a trabajar, pero no entiendo por qué. ¿Alguien podría explicarme qué está pasando aquí? Debe ser algo de magia de módulo de Python.

EDITAR: Todo también comienza a funcionar si elimino esta línea de base.py

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

Si elimino esta línea de web.templatetags.cb_tags, también comienza a funcionar:

from endless_pagination.templatetags import endless

Supongo que es porque, al final, conduce a

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

Así que crea algunas cosas circulares extrañas y el juego se acaba.

clima
fuente
Exactamente, al final siempre necesitarás configuraciones, incluso si es de django.conf
Guilherme David da Costa
2
Intente cambiar su DJANGO_SETTINGS_MODULE a settings.development
Guilherme David da Costa
Cualquiera que use virutalenvwrapper pruebe la respuesta de crimeminister en stackoverflow.com/questions/10738919/…
lukeaus

Respuestas:

107

Tuve el mismo error y resultó ser una dependencia circular entre un módulo o clase cargada por la configuración y el módulo de configuración en sí. En mi caso, era una clase de middleware que se nombró en la configuración que intentó cargar la configuración.

Sam Svenbjorgchristiensensen
fuente
4
Sí, creo que la circularidad lo hace.
clima
5
Refactorice para evitar la dependencia circular. La solución exacta es bastante específica para su propio código.
Sam Svenbjorgchristiensensen
6
Sugerencia: para identificar la causa del problema, por ejemplo, agregue una declaración de impresión aleatoria en el archivo de configuración y muévala para ver dónde se rompe.
Felix Böhme
14
No encontré una respuesta con esto.
Avinash Raj
8
Esta respuesta sería más útil si fuera más específica ... dice que el problema es "algo".
Hack-R
73

Me encontré con el mismo problema después de reestructurar la configuración según las instrucciones del libro de Daniel Greenfield Two scoops of Django .

Resolví el problema configurando

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

en manage.pyy wsgi.py.

Actualizar:

En la solución anterior, localestá el nombre del archivo (settings / local.py) dentro de mi carpeta de configuración, que contiene la configuración de mi entorno local.

Otra forma de resolver este problema es mantener todas sus configuraciones comunes dentro de settings / base.py y luego crear 3 archivos de configuración separados para sus entornos de producción, preparación y desarrollo.

Su carpeta de configuración se verá así:

settings/
    __init__.py
    base.py
    local.py
    prod.py
    stage.py

y mantenga el siguiente código en su settings/__init__.py

from .base import *

env_name = os.getenv('ENV_NAME', 'local')

if env_name == 'prod':
    from .prod import *
elif env_name == 'stage':
    from .stage import *
else:
    from .local import *
Jinesh
fuente
Para cualquiera que use Wagtail en PythonAnywhere, simplemente agregue el '.dev'. al final de esta línea en WSGI ... os.environ ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings.dev' más tarde necesitará crear un local.py fuera de su repositorio de origen para sus contraseñas, etc.
Inyoka
Debería ser la respuesta principal
Dev
ImportError: Ningún módulo llamado local
Tessaracter
@Tessaracter usa el nombre del archivo de configuración que usa en lugar de local. En mi caso, la configuración local se mantuvo en el archivo settings / local.py
Jinesh
1
Esto viola las convenciones de Django, reemplazando la correctamente documentada DJANGO_SETTINGS_MODULEcon una nueva variable de entorno personalizada que no es compatible de forma inmediata y debe tratarse manualmente. Me sorprende que esto tenga tantos votos a favor. Estoy trabajando en un proyecto con esta configuración y nos encontramos con muchos problemas, desde dificultades para configurar un entorno aislado para el desarrollo local hasta bibliotecas externas que se rompen porque esperan DJANGO_SETTINGS_MODULEque funcione como se esperaba y no lo hace.
Ariel
20

Tuve el mismo error con python manage.py runserver.

Para mí, resultó que se debía a un archivo binario compilado (.pyc) obsoleto. Después de eliminar todos esos archivos en mi proyecto, el servidor comenzó a ejecutarse nuevamente. :)

Entonces, si obtiene este error, de la nada, es decir, sin realizar ningún cambio aparentemente relacionado con la configuración de django, esta podría ser una buena primera medida.

akshay
fuente
2
gracias por este consejo. Tuve un problema idéntico en mi servidor de desarrollo. Eliminar todos los archivos .pyc de la carpeta del proyecto funcionó. Estaba editando el archivo settings.py justo antes de que esto sucediera.
croc
15

Eliminar archivos .pyc

Comando de terminal de Ubuntu para eliminar .pyc: find . -name "*.pyc" -exec rm -rf {} \;

Tengo el mismo error cuando hice python manage.py runserver. Fue porque el archivo .pyc. Eliminé el archivo .pyc del directorio del proyecto y luego estaba funcionando.

Aslam Khan
fuente
2
find . -type f -name *.pyc -deletehará
Srinivas Reddy Thatiparthy
7

No había especificado el archivo de configuración:

python manage.py runserver --settings=my_project.settings.develop
maugsburger
fuente
6

Comienza a funcionar porque en base.py tienes toda la información necesaria en un archivo de configuración básica. Necesitas la línea:

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

Entonces funciona y cuando lo hace from base import *, importa SECRET_KEY a su development.py.

Siempre debe importar la configuración básica antes de realizar cualquier configuración personalizada.


EDITAR: Además, cuando django importa el desarrollo de su paquete, inicializa todas las variables dentro de la base desde que definió from base import *dentro__init__.py

Guilherme David da Costa
fuente
lo siento, no entiendo tu punto. Hubo una importación de base * al comienzo de development.py y no funcionó.
clima
Oh, lo siento, he intervenido independientemente de lo que realmente estaba sucediendo. Django todavía está tratando de importar configuraciones desde configuraciones en lugar de su desarrollo.py, ya que parece ser la razón por la que funciona cuando importa base en init .py
Guilherme David da Costa
5

Creo que es el error del entorno , deberías intentar configurar:DJANGO_SETTINGS_MODULE='correctly_settings'

吾 慎行
fuente
4

Tuve el mismo problema con Celery. Mi setting.py antes :

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

después:

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

Si las variables de entorno no están definidas, entonces: SECRET_KEY = SU clave de desarrollo

MrNinjamannn
fuente
4

En el init .py del directorio de configuración, escriba la importación correcta, como:

from Project.settings.base import *

No es necesario cambiar wsgi.py o manage.py

c whisperer
fuente
¡Perfecto! Gracias.
Mayur
2

Resolví este problema que ocurría en OS X con Django tanto 1.5 como 1.6 desactivando todas las sesiones activas a virtualenv e iniciándolo nuevamente.

andilabs
fuente
2

Para cualquiera que use PyCharm: el botón verde "Ejecutar configuración seleccionada" produciría este error, pero ejecutar lo siguiente funciona:

py manage.py runserver 127.0.0.1:8000 --settings=app_name.settings.development

Para solucionar esto, debe editar las variables de entorno de la configuración. Para hacer esto, haga clic en el menú desplegable "Seleccionar configuración de ejecución / depuración" a la izquierda del botón verde de ejecución y luego haga clic en "editar configuración". En la pestaña "entorno", cambie la variable de entorno DJANGO_SETTINGS_MODULEa app_name.settings.development.

Jamie Williams
fuente
1

Solo quería agregar que recibí este error cuando el nombre de mi base de datos estaba mal escrito en mi settings.pyarchivo, por lo que no se pudo crear la base de datos.

Lexo
fuente
1

Resolví este problema en 1.8.4 arreglando la configuración de PLANTILLAS que tenía un error tipográfico (eliminar PLANTILLAS ['depurar'] lo resolvió)

Revise la configuración que ha cambiado recientemente, asegúrese de que todas las claves estén según el libro.

Oriadam
fuente
1

Para agregar otra posible solución a la mezcla, tenía una settingscarpeta y unasettings.py directorio de mi proyecto. (Estaba volviendo a cambiar de archivos de configuración basados ​​en el entorno a un archivo. Desde entonces lo he reconsiderado).

Python se estaba confundiendo acerca de si quería importar project/settings.pyo project/settings/__init__.py. Eliminé el settingsdirectorio y ahora todo funciona bien.

Brendan Quinn
fuente
0

Resolví este problema eliminando los espacios alrededor de los signos iguales ( =) en mi .envarchivo.

aiven
fuente
0

En mi caso, el problema era que tenía mi app_foldery settings.pyen él. Entonces decidí hacer el Settings folderinterior app_folder- y eso hizo una colisión con settings.py. Simplemente renombré eso Settings folder, y todo funcionó.

Chiefir
fuente
0

A mi Mac OS no le gustó que no encontrara la variable env establecida en el archivo de configuración:

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

pero después de agregar env var a mi entorno de desarrollo local de Mac OS, el error desapareció:

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

En mi caso, también necesitaba agregar el --settingsparámetro:

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

donde production.py es un archivo que contiene configuraciones específicas de producción dentro de una carpeta de configuraciones.

Samer
fuente
0

El problema para mí fue llamar get_text_noopen el iterable LANGUAGES.

Cambiando

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

a

from django.utils.translation import gettext_lazy as _

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

en el archivo de configuración base resolvió la ImproperlyConfigured: The SECRET_KEY setting must not be emptyexcepción.

Sepia
fuente
0

Resolví el problema anterior comentando la línea en mi configuración.py

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

SECRET_KEYdeclarado en mi ~/.bashrcarchivo (para usuarios de Linux Ubuntu)

Para fines de desarrollo en mi máquina local, no usé la variable evironmnet

SECRET_KEY = '(i9b4aes#h1)m3h_8jh^duxrdh$4pu8-q5vkba2yf$ptd1lev_'

la línea anterior no dio el error

Ankit Tiwari
fuente
0

En mi caso, mientras configuraba una acción de Github, me olvidé de agregar las variables env al archivo yml:

jobs:
  build:
    env:
     VAR1: 1
     VAR2: 5
Rexcirus
fuente
0

La razón por la que hay tantas respuestas diferentes es porque la excepción probablemente no tenga nada que ver con SECRET_KEY. Probablemente sea una excepción anterior la que se esté tragando. Active la depuración usando DEBUG = True para ver la excepción real.

Amit Klein
fuente
0

En mi caso, después de una búsqueda larga, encontré que PyCharm en la configuración de Django (Configuración> Idiomas y marcos> Django) tenía el campo del archivo de configuración indefinido. Debe hacer que este campo apunte al archivo de configuración de su proyecto. Luego, debe abrir la configuración Ejecutar / Depurar y eliminar la variable de entorno DJANGO_SETTINGS_MODULE = ruta existente.

Esto sucede porque el complemento Django en PyCharm fuerza la configuración del marco. Por tanto, no tiene sentido configurar ningún os.environ.setdefault ('DJANGO_SETTINGS_MODULE', 'myapp.settings')

Thalles Rosa
fuente
0

Importe base.py __init__.py solo. ¡asegúrese de no repetir la misma configuración de nuevo !.

establecer variable de entorno SET DJANGO_DEVELOPMENT =dev

settings/
  __init__.py
  base.py
  local.py
  production.py

En __init__.py

from .base import *
if os.environ.get('DJANGO_DEVELOPMENT')=='prod':
   from .production import *
else:
   from .local import *

En base.pyconfigurado las configuraciones globales. excepto para la base de datos. me gusta

SECRET_KEY, ALLOWED_HOSTS,INSTALLED_APPS,MIDDLEWARE .. etc....

En local.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'database',
    'USER': 'postgres',
    'PASSWORD': 'password',
    'HOST': 'localhost',
    'PORT': '5432',
}
}
Ramesh Ponnusamy
fuente