postgreSQL과 drf를 환경변수로 연동하기

매일 성장하는 개발자·2023년 11월 2일

AI 웹 개발

목록 보기
34/36

연동 시도

시도 1

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 건들이지 않았기에.

시도2

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 메소드를 써줘야 호출을 하는데, 메소드를 안 씀.

시도 3 성공

참고: 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"),
    }
}
manage.py
import dotenv # 추가

if __name__ == '__main__':
    dotenv.read_dotenv() # 추가
    main()

os.environ.get()
manage.py에 import dotenv 추가
main 함수 호출 전 줄에 dotenv.read_dotenv() 추가!
.env에선 꼭 변수와 값 사이에 공백이 없게 넣어야 한다!

어제의 뻘짓의 원인을 찾아보자!

환경변수 pip django-environ VS django-dotenv

pip install django-environ

https://pypi.org/project/django-environ/

  • 최신버전: 2023
$ 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')
}
  • dotenv는 manage.py를 건드려야 하고, environ은 건드리지 않고 settings.py에서만 설정해주면 되는구나

pip install django-dotenv

https://pypi.org/project/django-dotenv/

PostgreSQL과 django-environ

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 install
pip django-environ
pip install psycopg2
.env
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
settings.py

import environ
env = environ.Env()
environ.Env.read_env()

.gitignore to not push .env file
Your secret key
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"),
    }
}

깨달은 점

구글링해서 긁어온 것을 그냥 무작정 실행시키기보다는, 무엇인지 이 코드 한 줄이 어떤 의미라서 오류가 발생하는지에 대한 원인을 생각해보자.

추가: SECRET_KEY 재발급

이미 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 하면 된다.

profile
로드 투 개발자 아카이빙

0개의 댓글