django.core.exceptions.ImproperlyConfigured: Setarea SECRET_KEY nu trebuie să fie goală (Programare, Python, Django)

Ashish Patil a intrebat.
a intrebat.

Am creat un nou proiect în django și am lipit câteva fișiere dintr-un alt proiect. Ori de câte ori încerc să execut serverul, primesc următorul mesaj de eroare:

    Traceback (most recent call last):
      File "manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
      File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
        utility.execute()
      .
      .
      .
            File "/Library/Python/2.7/site-packages/django/conf/__init__.py", line 115, in __init__
        raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
    django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

Iată fișierul meu settings.py

""" Django settings for dbe project.  """

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
from os.path import join as pjoin
BASE_DIR = os.path.dirname(os.path.dirname(__file__))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/


# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
TEMPLATE_DEBUG = True
ALLOWED_HOSTS = []

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'shared',
    'issues',
    'blog',
    'bombquiz',
    'forum',
    'portfolio',
    'questionnaire',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

TEMPLATE_DIRS = (
     os.path.join(BASE_DIR, "templates"),
     os.path.join(BASE_DIR, "templates", "issues"),
     os.path.join(BASE_DIR, "templates", "blog"),
     os.path.join(BASE_DIR, "templates", "bombquiz"),
     os.path.join(BASE_DIR, "templates", "forum"),
     os.path.join(BASE_DIR, "templates", "portfolio"),
     os.path.join(BASE_DIR, "templates", "questionnaire"),
     )

ROOT_URLCONF = 'dbe.urls'

WSGI_APPLICATION = 'dbe.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.7/howto/static-files/

MEDIA_URL = '/media/'
MEDIA_ROOT = pjoin(BASE_DIR, "media")
STATIC_URL = '/static/'
STATICFILES_DIRS = (
                    pjoin(BASE_DIR, "static"),
                    )

try:
    from local_settings import *
except:
    pass

Aici este și manage.py

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dbe.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Orice ajutor? Mulțumesc!

Comentarii

  • Se pare că DJANGO_SETTINGS_MODULE nu este încărcat corect. Poți confirma că settings.py este de fapt dbe/settings.py? –  > Por bvanvugt.
  • Posibil duplicat al Django: ImproperlyConfigured: Setarea SECRET_KEY nu trebuie să fie goală –  > Por physicalattraction.
2 răspunsuri
rnevius

Așa cum spune eroarea, nu aveți nici un SECRET_KEY definit. Trebuie să adăugați unul la dvs. settings.py.

Django va refuza să pornească dacă SECRET_KEY nu este setat.

Puteți citi mai multe despre această setare în documentația.

SECRET_KEY poate fi aproape orice… dar dacă doriți să utilizați Django pentru a genera unul, puteți face următoarele din shell-ul python:

>>> from django.utils.crypto import get_random_string
>>> chars = '[email protected]#$%^&*(-_=+)'
>>> SECRET_KEY = get_random_string(50, chars)
>>> print SECRET_KEY

Copiați fișierul SECRET_KEY în fișierul dvs. de setări.

Comentarii

  • Doar pentru a fi siguri: The SECRET_KEY trebuie să fie aleatoriu și secret. Dacă folosiți șirul postat mai sus, veți complet compromiteți complet securitatea lui Django. –  > Por Klaus D..
  • @KlausD. Nu am postat o cheie secretă. Am postat o modalitate de a genera o cheie secretă sigură. Acesta este exact modul în care Django creează chei secrete atunci când rulați startproject –  > Por rnevius.
  • Aveți dreptate. Nu mi-am băut prima cafea înainte de a o citi 😐 Pe de altă parte, dacă cineva folosește asta în settings.py va avea probleme cu acel cod atunci când există mai multe instanțe (sau procese) ale instalației Django care rulează. Ceea ce este posibil în majoritatea mediilor de producție. Doar pentru a sublinia acest lucru. Întotdeauna există oameni care ar putea încerca asta 😉 –  > Por Klaus D..
  • Acum puteți utiliza from django.core.management.utils import get_random_secret_key get_random_secret_key() –  > Por Davide Pizzolato.
bgarcial

SECRET_KEY variabila din settings.py ar trebui să fie păstrată secretă

Puteți plasa șirul de caractere cheie secretă generată cu ajutorul funcției get_random_stringde mai sus (așa cum a spus @rnevius ) în settings.py, dar utilizați o funcție care să obțină variabila.

Aceasta înseamnă că, din motive de securitate, este mai bine să ascundeți conținutul variabilei SECRET_KEY.

Puteți defini o variabilă de mediu după cum urmează:

În fișierul dvs. $HOME/.bashrc sau $HOME/.zshrc sau /etc/bashrc sau /etc/bash.bashrc în funcție de sistemul de operare unix și de gestionarul de terminale pe care îl utilizați:

export SECRET_KEY='value_of_the_secret_key_generated_by_get_random_string_function'

puteți arăta astfel:

export SECRET_KEY='lmrffsgfhrilklg-za7#57vi!zr)ps8)2anyona25###dl)s-#s=7=vn_'

Și în settings.py puteți adăuga următoarele:

import os
from django.core.exceptions import ImproperlyConfigured

def get_env_variable(var_name):
    try:
        return os.environ[var_name]
    except KeyError:
        error_msg = "Set the %s environment variable" % var_name
        raise ImproperlyConfigured(error_msg)

SECRET_KEY = get_env_variable('SECRET_KEY')

Funcția get_env_variable încearcă să obțină variabila var_name din mediu, iar dacă nu o găsește, generează o eroare ImproperlyConfigured. Utilizând-o în acest mod, atunci când încercați să vă rulați aplicația și variabila SECRET_KEY nu este găsită, veți putea vedea un mesaj care indică motivul pentru care proiectul nostru eșuează.

De asemenea, în acest mod puteți proteja variabilele de conținut secret ale proiectului.