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.
Respostas:
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.
fonte
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
em
manage.py
ewsgi.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:
e mantenha o seguinte código em seu
settings/__init__.py
fonte
local
. No meu caso, as configurações locais foram mantidas no arquivo settings / local.pyDJANGO_SETTINGS_MODULE
por 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 esperamDJANGO_SETTINGS_MODULE
que funcione conforme o esperado e não funciona.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.
fonte
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.
fonte
find . -type f -name *.pyc -delete
vaiEu não tinha especificado o arquivo de configurações:
fonte
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:
Portanto, funciona e quando você faz
from base import *
isso, ele importa SECRET_KEY para o seudevelopment.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
fonte
Acho que é o erro de ambiente , você deve tentar definir:
DJANGO_SETTINGS_MODULE='correctly_settings'
fonte
Tive o mesmo problema com o aipo. Minha configuração.py antes :
depois de:
Se as variáveis de ambiente não forem definidas: SECRET_KEY = SUA chave de desenvolvimento
fonte
No init .py do diretório de configurações, escreva a importação correta, como:
Não há necessidade de alterar wsgi.py ou manage.py
fonte
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.
fonte
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_MODULE
paraapp_name.settings.development
.fonte
Queria apenas acrescentar que recebi este erro quando o nome do meu banco de dados foi digitado incorretamente no meu
settings.py
arquivo, de forma que o banco de dados não pôde ser criado.fonte
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.
fonte
Para lançar outra solução potencial na mistura, eu tinha uma
settings
pasta, 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.py
ouproject/settings/__init__.py
. Removi osettings
dir e agora tudo funciona bem.fonte
Resolvi esse problema removendo os espaços ao redor dos sinais de igual (
=
) em meu.env
arquivo.fonte
No meu caso, o problema era - eu tinha o meu
app_folder
esettings.py
nele. Então eu decidi fazerSettings folder
dentroapp_folder
- e isso colidiu comsettings.py
. Acabei de renomear issoSettings folder
- e tudo funcionou.fonte
Meu Mac OS não gostou de não encontrar a variável env definida no arquivo de configurações:
mas depois de adicionar env var ao meu ambiente de desenvolvimento local do Mac OS, o erro desapareceu:
No meu caso, também precisei adicionar o
--settings
parâmetro:onde production.py é um arquivo que contém configurações específicas de produção dentro de uma pasta de configurações.
fonte
O problema para mim era chamar
get_text_noop
o iterável LANGUAGES.Mudando
para
no arquivo de configurações básicas resolveu a
ImproperlyConfigured: The SECRET_KEY setting must not be empty
exceção.fonte
Resolvi o problema acima comentando a linha em meu settings.py
SECRET_KEY
declarado em meu~/.bashrc
arquivo (para usuários Linux Ubuntu)Para fins de desenvolvimento em minha máquina local, não usei a variável evironmnet
acima da linha não deu o erro
fonte
No meu caso, ao configurar uma ação Github, esqueci de adicionar as variáveis env ao arquivo yml:
fonte
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.
fonte
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')
fonte
fonte