import os
import environ
env = environ.Env()
environ.Env.read_env()
SECRET_KEY = env("SECRET_KEY")
-> django.core.exceptions.ImproperlyConfigured: Set the SECRET_KEY environment variable
.env 값을 못 불러옴.. 왤까?
-> 해결 후 문제의 원인: manage.py 건들이지 않았기에.
os.environ("SECRET_KEY")
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ("DB_NAME"),
'USER' : os.environ("DB_USER"),
'PASSWORD': os.environ("DB_PASSWORD"),
'HOST': os.environ("DB_HOST"),
'PORT': os.environ("DB_PORT"),
}
}
TypeError: '_Environ' object is not callable
os.environ에 .get 메소드를 써줘야 호출을 하는데, 메소드를 안 씀.
참고: https://velog.io/@gracegoh/DRF-2-환경변수-설정하기
$ pip install psycopg2
$ pip install django-environ
$ pip install django-dotenv
import os
import environ
SECRET_KEY = os.environ.get("SECRET_KEY")
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get("DB_NAME"),
'USER' : os.environ.get("DB_USER"),
'PASSWORD': os.environ.get("DB_PASSWORD"),
'HOST': os.environ.get("DB_HOST"),
'PORT': os.environ.get("DB_PORT"),
}
}
import dotenv # 추가
if __name__ == '__main__':
dotenv.read_dotenv() # 추가
main()
os.environ.get()
manage.py에import dotenv추가
main 함수 호출 전 줄에dotenv.read_dotenv()추가!
.env에선 꼭 변수와 값 사이에 공백이 없게 넣어야 한다!
https://pypi.org/project/django-environ/
$ pip install psycopg2
$ pip install django-environ
# .env 파일 생성
$ touch .env
import environ
import os
env = environ.Env(
# set casting, default value
DEBUG=(bool, False)
)
# Set the project base directory
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Take environment variables from .env file
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
# False if not in os.environ because of casting above
DEBUG = env('DEBUG')
# Raises Django's ImproperlyConfigured
# exception if SECRET_KEY not in os.environ
SECRET_KEY = env('SECRET_KEY')
# Parse database connection url strings
# like psql://user:pass@127.0.0.1:8458/db
DATABASES = {
# read os.environ['DATABASE_URL'] and raises
# ImproperlyConfigured exception if not found
#
# The db() method is an alias for db_url().
'default': env.db(),
# read os.environ['SQLITE_URL']
'extra': env.db_url(
'SQLITE_URL',
default='sqlite:////tmp/my-tmp-sqlite.db'
)
}
CACHES = {
# Read os.environ['CACHE_URL'] and raises
# ImproperlyConfigured exception if not found.
#
# The cache() method is an alias for cache_url().
'default': env.cache(),
# read os.environ['REDIS_URL']
'redis': env.cache_url('REDIS_URL')
}
https://pypi.org/project/django-dotenv/

PostgreSQL
Database Backend: django.db.backends.postgresql
URL schema: postgres://user:password@host:port/dbname
With PostgreSQL you can use the following schemas: postgres, postgresql, psql, pgsql, postgis. You can also use UNIX domain sockets path instead of hostname. For example: postgres://path/dbname. The django.db.backends.postgresql_psycopg2 will be used if the Django version is less than 2.0.
참고 django-environ
https://django-environ.readthedocs.io/en/latest/types.html
https://stackpython.medium.com/how-to-start-django-project-with-a-database-postgresql-aaa1d74659d8
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'your_db_name',
'USER': 'postgres',
'PASSWORD': 'your_db_password',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
pip django-environ
pip install psycopg2
SECRET_KEY=django-insecure-728k0bs%91o$^sp%aa_ji@2fmtwpdk7r1na#*$%l2+%)7tnpo3
DB_NAME=your_db_name
DB_USER=your_db_user
DB_PASSWORD=your_password
DB_HOST=localhost
DB_PORT=5432
import environ
env = environ.Env()
environ.Env.read_env()
SECRET_KEY = env("SECRET_KEY")
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': env("DB_NAME"),
'USER': env("DB_USER"),
'PASSWORD': env("DB_PASSWORD"),
'HOST': env("DB_HOST"),
'PORT': env("DB_PORT"),
}
}
구글링해서 긁어온 것을 그냥 무작정 실행시키기보다는, 무엇인지 이 코드 한 줄이 어떤 의미라서 오류가 발생하는지에 대한 원인을 생각해보자.
이미 settings.py를 업로드해서 시크릿키가 노출되었다면 새로운 시크릿키를 발급 받을 수 있다.
(venv) PS C:\Users\gracegoh\Desktop\drf_week2> python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
새로 받은 시크릿키를 .env 파일에 붙여넣은 뒤
runserver 하면 된다.