Django: ImproperlyConfigured: A configuração SECRET_KEY não deve estar vazia

100

Estou tentando configurar vários arquivos de configuração (desenvolvimento, produção, ..) que incluem algumas configurações básicas. Porém, não pode ter sucesso. Quando tento executar ./manage.py runserver, recebo o seguinte erro:

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

Aqui está meu módulo de configurações:

(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

Configurações básicas (contém 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'

Um dos arquivos de configuração:

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

Se eu adicionar from base import *em /srv/www/cb/cb/settings/__init__.py(que de outra forma está vazio), ele magicamente começa a funcionar, mas não entendo por quê. Alguém poderia me explicar o que está acontecendo aqui? Deve ser alguma mágica do módulo python.

EDIT: Tudo também começa a funcionar se eu remover esta linha de base.py

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

Se eu remover essa linha de web.templatetags.cb_tags, ela também começará a funcionar:

from endless_pagination.templatetags import endless

Acho que é porque, no final, leva a

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

Então, ele cria algumas coisas circulares estranhas e o jogo acaba.

clima
fonte
Exatamente, no final você sempre vai precisar de configurações, mesmo que seja do django.conf
Guilherme David da Costa
2
Tente mudar seu DJANGO_SETTINGS_MODULE para settings.development
Guilherme David da Costa
Qualquer um usando virutalenvwrapper tente a resposta do crimeminister em stackoverflow.com/questions/10738919/…
lukeaus

Respostas:

107

Eu tive o mesmo erro e acabou sendo uma dependência circular entre um módulo ou classe carregada pelas configurações e o próprio módulo de configurações. No meu caso, foi uma classe de middleware que foi nomeada nas configurações que tentaram carregar as configurações.

Sam Svenbjorgchristiensen
fonte
4
Sim, eu acho que a circularidade faz isso.
clima
5
Refatore para evitar dependência circular. A solução exata é bastante específica para seu próprio código.
Sam Svenbjorgchristiensensen
6
Dica: para identificar o que está causando o problema, por exemplo, adicione uma declaração de impressão aleatória no arquivo de configurações e mova-o para ver onde ele quebra.
Felix Böhme
14
Eu não encontrei uma resposta com isso.
Avinash Raj
8
Esta resposta seria mais útil se fosse mais específica ... diz que o problema é "alguma coisa".
Hack-R
73

Eu tive o mesmo problema depois de reestruturar as configurações de acordo com as instruções do livro Two scoops of Django de Daniel Greenfield .

Resolvi o problema definindo

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

em manage.pye wsgi.py.

Atualizar:

Na solução acima, localé o nome do arquivo (settings / local.py) dentro da minha pasta de configurações, que contém as configurações do meu ambiente local.

Outra maneira de resolver esse problema é manter todas as configurações comuns em settings / base.py e, em seguida, criar 3 arquivos de configurações separados para seus ambientes de produção, teste e desenvolvimento.

Sua pasta de configurações será semelhante a:

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

e mantenha o seguinte código em seu 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
fonte
Para quem usa o Wagtail no PythonAnywhere, basta adicionar o '.dev.' no final desta linha em WSGI ... os.environ ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings.dev' posteriormente, você precisará criar um local.py fora de seu repositório de fontes para suas senhas etc.
Inyoka
Deve ser a melhor resposta
Dev
ImportError: Nenhum módulo denominado local
Tessaracter
@Tessaracter usa o nome do arquivo de configurações que você usa em vez de local. No meu caso, as configurações locais foram mantidas no arquivo settings / local.py
Jinesh
1
Isso viola as convenções do Django, substituindo o devidamente documentado DJANGO_SETTINGS_MODULEpor uma nova variável de ambiente customizada que não é suportada por padrão e deve ser tratada manualmente. Estou surpreso que tenha tantos votos positivos. Estou trabalhando em um projeto com essa configuração e estamos encontrando muitos problemas, desde dificuldades em configurar um ambiente isolado para desenvolvimento local até bibliotecas externas quebrando porque esperam DJANGO_SETTINGS_MODULEque funcione conforme o esperado e não funciona.
Ariel
20

Eu tive o mesmo erro com python manage.py runserver.

Para mim, descobri que era por causa de um arquivo binário compilado obsoleto (.pyc). Depois de excluir todos esses arquivos em meu projeto, o servidor começou a funcionar novamente. :)

Portanto, se você receber esse erro, do nada, ou seja, sem fazer nenhuma alteração aparentemente relacionada às configurações do django, esta pode ser uma boa primeira medida.

akshay
fonte
2
obrigado por esta dica. Tive um problema idêntico no meu servidor de desenvolvimento. Excluir todos os arquivos .pyc da pasta do projeto resolveu o problema. Eu estava editando o arquivo settings.py antes de isso acontecer.
croc
15

Remover arquivos .pyc

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

Eu tive o mesmo erro quando fiz python manage.py runserver. Foi porque o arquivo .pyc. Excluí o arquivo .pyc do diretório do projeto, então ele estava funcionando.

Aslam Khan
fonte
2
find . -type f -name *.pyc -deletevai
servir
7

Eu não tinha especificado o arquivo de configurações:

python manage.py runserver --settings=my_project.settings.develop
Maugsburger
fonte
6

Ele começa a funcionar porque no base.py você tem todas as informações necessárias em um arquivo de configurações básicas. Você precisa da linha:

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

Portanto, funciona e quando você faz from base import *isso, ele importa SECRET_KEY para o seu development.py.

Você sempre deve importar as configurações básicas antes de fazer qualquer configuração personalizada.


EDITAR: Além disso, quando django importa o desenvolvimento do seu pacote, ele inicializa todas as variáveis ​​dentro da base desde que você definiu from base import *dentro__init__.py

Guilherme David da Costa
fonte
desculpe, eu não entendi seu ponto. Havia import * de base no início de development.py e não funcionou.
clima
Oh, desculpe, eu entrei independentemente do que estava realmente acontecendo. Django ainda está tentando importar as configurações de settings em vez de seu development.py, pois parece que a razão de trabalhar quando você importa a base em init .py
Guilherme David da Costa
5

Acho que é o erro de ambiente , você deve tentar definir:DJANGO_SETTINGS_MODULE='correctly_settings'

吾 慎行
fonte
4

Tive o mesmo problema com o aipo. Minha configuração.py antes :

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

depois de:

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

Se as variáveis ​​de ambiente não forem definidas: SECRET_KEY = SUA chave de desenvolvimento

MrNinjamannn
fonte
4

No init .py do diretório de configurações, escreva a importação correta, como:

from Project.settings.base import *

Não há necessidade de alterar wsgi.py ou manage.py

sussurrador
fonte
Perfeito! Obrigado.
Mayur
2

Resolvi esse problema que ocorria no OS X com Django 1.5 e 1.6 desativando todas as sessões ativas para virtualenv e iniciando-o novamente.

andilabs
fonte
2

Para qualquer pessoa que use o PyCharm: o botão verde "Executar configuração selecionada" produziria esse erro, mas executando as seguintes funções:

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

Para corrigir isso, você precisa editar as variáveis ​​de ambiente da configuração. Para fazer isso, clique no menu suspenso "Selecionar configuração de execução / depuração" à esquerda do botão verde de execução e clique em "editar configuração". Na guia "ambiente", altere a variável de ambiente DJANGO_SETTINGS_MODULEpara app_name.settings.development.

Jamie Williams
fonte
1

Queria apenas acrescentar que recebi este erro quando o nome do meu banco de dados foi digitado incorretamente no meu settings.pyarquivo, de forma que o banco de dados não pôde ser criado.

Lexo
fonte
1

Resolvi esse problema no 1.8.4 corrigindo as configurações de TEMPLATES que apresentavam um erro de digitação (removendo TEMPLATES ['debug'] resolveu)

Reveja as configurações que você alterou recentemente, certifique-se de que todas as chaves estão de acordo com o livro.

Oriadam
fonte
1

Para lançar outra solução potencial na mistura, eu tinha uma settingspasta, bem como umsettings.py no diretório do meu projeto. (Eu estava voltando dos arquivos de configurações baseadas no ambiente para um arquivo. Desde então, reconsiderei.)

Python estava ficando confuso sobre se eu queria importar project/settings.pyou project/settings/__init__.py. Removi o settingsdir e agora tudo funciona bem.

Brendan Quinn
fonte
0

Resolvi esse problema removendo os espaços ao redor dos sinais de igual ( =) em meu .envarquivo.

aiven
fonte
0

No meu caso, o problema era - eu tinha o meu app_foldere settings.pynele. Então eu decidi fazer Settings folderdentro app_folder- e isso colidiu com settings.py. Acabei de renomear isso Settings folder- e tudo funcionou.

Chiefir
fonte
0

Meu Mac OS não gostou de não encontrar a variável env definida no arquivo de configurações:

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

mas depois de adicionar env var ao meu ambiente de desenvolvimento local do Mac OS, o erro desapareceu:

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

No meu caso, também precisei adicionar o --settingsparâmetro:

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

onde production.py é um arquivo que contém configurações específicas de produção dentro de uma pasta de configurações.

Samer
fonte
0

O problema para mim era chamar get_text_noopo iterável LANGUAGES.

Mudando

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

para

from django.utils.translation import gettext_lazy as _

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

no arquivo de configurações básicas resolveu a ImproperlyConfigured: The SECRET_KEY setting must not be emptyexceção.

Sépia
fonte
0

Resolvi o problema acima comentando a linha em meu settings.py

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

SECRET_KEYdeclarado em meu ~/.bashrcarquivo (para usuários Linux Ubuntu)

Para fins de desenvolvimento em minha máquina local, não usei a variável evironmnet

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

acima da linha não deu o erro

Ankit Tiwari
fonte
0

No meu caso, ao configurar uma ação Github, esqueci de adicionar as variáveis ​​env ao arquivo yml:

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

A razão pela qual existem tantas respostas diferentes é porque a exceção provavelmente não tem nada a ver com SECRET_KEY. É provavelmente uma exceção anterior que está sendo engolida. Ative a depuração usando DEBUG = True para ver a exceção real.

Amit Klein
fonte
0

No meu caso, após uma longa pesquisa, descobri que o PyCharm nas configurações do Django (Configurações> Idiomas e Frameworks> Django) tinha o campo do arquivo de configuração indefinido. Você deve fazer este campo apontar para o arquivo de configurações do seu projeto. Em seguida, você deve abrir as configurações de Executar / Depurar e remover a variável de ambiente DJANGO_SETTINGS_MODULE = caminho existente.

Isso acontece porque o plugin Django no PyCharm força a configuração do framework. Portanto, não há nenhum ponto em configurar qualquer os.environ.setdefault ('DJANGO_SETTINGS_MODULE', 'myapp.settings')

Thalles Rosa
fonte
0

Importar base.py em __init__.py sozinho. certifique-se de não repetir a mesma configuração novamente !.

definir variável de ambiente SET DJANGO_DEVELOPMENT =dev

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

No __init__.py

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

Em base.pyconfiguradas as configurações globais. exceto para banco de dados. gostar

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

No local.py

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