18

This project was working fine until I used environ to make SECRET_KEY and DEBUG as environment variable using environ. After I am getting this error:-

The output is:

(env) E:\ecommercedj>python manage.py runserver
Traceback (most recent call last):
  File "E:\ecommercedj\env\lib\site-packages\environ\environ.py", line 273, in get_value
    value = self.ENVIRON[var]
  File "c:\users\matruchhaya\appdata\local\programs\python\python38-32\lib\os.py", line 675, in __getitem__
    raise KeyError(key) from None
KeyError: 'SECRET_KEY'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "E:\ecommercedj\env\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "E:\ecommercedj\env\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "E:\ecommercedj\env\lib\site-packages\django\core\management\base.py", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "E:\ecommercedj\env\lib\site-packages\django\core\management\commands\runserver.py", line 60, in execute
    super().execute(*args, **options)
  File "E:\ecommercedj\env\lib\site-packages\django\core\management\base.py", line 369, in execute
    output = self.handle(*args, **options)
  File "E:\ecommercedj\env\lib\site-packages\django\core\management\commands\runserver.py", line 67, in handle
    if not settings.DEBUG and not settings.ALLOWED_HOSTS:
  File "E:\ecommercedj\env\lib\site-packages\django\conf\__init__.py", line 76, in __getattr__
    self._setup(name)
  File "E:\ecommercedj\env\lib\site-packages\django\conf\__init__.py", line 63, in _setup
    self._wrapped = Settings(settings_module)
  File "E:\ecommercedj\env\lib\site-packages\django\conf\__init__.py", line 142, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "c:\users\matruchhaya\appdata\local\programs\python\python38-32\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "E:\ecommercedj\ecom\settings.py", line 11, in <module>
    SECRET_KEY = env('SECRET_KEY')
  File "E:\ecommercedj\env\lib\site-packages\environ\environ.py", line 123, in __call__
    return self.get_value(var, cast=cast, default=default, parse_default=parse_default)
  File "E:\ecommercedj\env\lib\site-packages\environ\environ.py", line 277, in get_value
    raise ImproperlyConfigured(error_msg)
django.core.exceptions.ImproperlyConfigured: Set the SECRET_KEY environment variable

(env) E:\ecommercedj>

settings.py

import os
import environ

env = environ.Env()

# read th .env file
environ.Env.read_env()

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = env('SECRET_KEY')

DEBUG = env('DEBUG')

ALLOWED_HOSTS = ['*']
.....

.env file

SECRET_KEY value is unquoted

SECRET_KEY = my_secret_key_value
DEBUG = True

The project was running fine before adding environ. Am I getting the error because of eviron? How should I remove this error?

4
  • 1
    put SECRET_KEY = "my_secret_key_value" put quotes in .env file Commented Jul 28, 2020 at 15:12
  • What lib are you using to handle environment variables? Commented Jul 28, 2020 at 15:16
  • I have tried putting "my_secret_key_value" in quotes. It still doesn't work. I am using ENVIRON for handling environment variables. Commented Jul 29, 2020 at 2:49
  • if you are using docker container you must do additional settings Commented Oct 3, 2021 at 13:29

10 Answers 10

35

The .env file should be in the same directory as settings.py

Sign up to request clarification or add additional context in comments.

2 Comments

This problem has already been resolved and was not related to the location of the file.
After moving the file to same level as settings.py the problem got removed
29

Solved it!!

In the .env file remove the spaces between assignment operator and var, and between value and assignment operator. Like:

SECRET_KEY=my_secret_key_value
DEBUG=True

Comments

4
  1. First Create .env file in the same directory as the settings

  2. Second, remove any space between variable and key-value (i.e KEY=my_key)

    import environ
    
    env = environ.Env()
    environ.Env.read_env(os.path.join(BASE_DIR, 'somepath/.env')) #<-- where ever your .env lies inside project directory
    SECRET_KEY = os.environ.get('somekeyInsidenvFile',env('somekeyInsidenvFile')) #
    

Comments

3

First, install Django-environ like this

pip install django-environ

next, import environs in your settings.py like this

import os
import environ
from pathlib import Path
from django.core.exceptions import ImproperlyConfigured

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

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

# SECURITY WARNING: keep the secret key used in production secret!
env = environ.Env()
environ.Env.read_env()


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

it is the normal Django settings file, what you did is import os, environ, ImproperlyConfigured from the exception, write the function get_env_variable and call it against the SECRET_KEY

next, create a .env file in the same directory as your settings.py file with this content

SECRET_KEY=django-insecure-b)8xiyg09+9)e4ko!o_*%5am=5(%=-%uvo5g*618619)8xcwfa

replace the secret key string with your own. you can reference this material

Comments

3

Actually there is a simple solution.

settings.py

import os
import environ

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

env = environ.Env()

# read th .env file
environ.Env.read_env(env_file=str(BASE_DIR) + '/.env')    

SECRET_KEY = env('SECRET_KEY')

DEBUG = env('DEBUG')

ALLOWED_HOSTS = ['*']
.....

.env file

SECRET_KEY=secret_key_value
DEBUG=True

Finally, don't use spaces before and after equals in the .env file.

Comments

2

clear the spaces in .env!!

In the .env file remove the spaces between assignment operator and var, and between value and assignment operator. Like:

DJANGO_SECRET_KEY="NDCNSDIWBDVIBDVUOWDVJ30F9342FE20F9JCME"
DEBUG="True"

Comments

1

Having no spaces between SECRET_KEY=my_secret_key_value solved it for me!

Comments

1

If your SECRET_KEY starts with $ (dollar sign) you will encounter same exception as OP, which is a known bug with django-environ package.

In this case, just generate new SECRET_KEY:

from django.core.management.utils import get_random_secret_key
print(get_random_secret_key())

1 Comment

dastxosh brammmm
0

Also had the same error. My personal issue was due to the location of the .env file.

My file structure was as follows:

BASEDIRECTORY
  Django-Project
    myapp1
    myapp2
    myInitializedProjectApp
      settings.py
      wsgi.py
      ...
  .env
  .gitignore
  Dockerfile
  ...

So my env app was at the same level as my Django-project folder

in my settings.py, after BASE_DIR is declared i included: env.read_env('../.env')

which I guess is basically sending the folder up one from the BASE_DIR to the location of the .env it needs to read.

Comments

0

For some cases, you may want to set variables on settings based on env var, or if no env var is set use some default.

Provide a default option to avoid ImproperlyConfigured Exception,

SECRET_KEY = env('SECRET_KEY', default="asdfasdfasdfasdf")

DEBUG = env('DEBUG', default=False)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.