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:-
(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>
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 = ['*']
.....
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?
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"
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
Actually there is a simple solution.
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 = ['*']
.....
SECRET_KEY=secret_key_value
DEBUG=True
Finally, don't use spaces before and after equals in the .env file.
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())
First Create .env file in the same directory as the settings
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')) #
Having no spaces between SECRET_KEY=my_secret_key_value solved it for me!
The .env file should be in the same directory as settings.py
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