Django settings.py
Django 프로젝트 구조 중 settings.py 파일은 매우 중요한 역할을 가지고 있음
프로젝트의 설정을 담당하는 파일로 프로젝트 전체에서 사용되는 설정을 정의함
Settings.py 파일 구조
1. 경로 상수
BASE_DIR = PATH(__file__).resolve().parent.parent
BASE_DIR : BASE_DIR 상수는 프로젝트의 최상위 디렉터리를 의미, 다른 경로들을 계산하는 데 유용
기존에 os 모듈을 사용하다 window에서 몇 가지 문제점이 발견되며 path 라이브러리 사용 시작
>>> from pathlib import Path
>>> Path('a') / 'b' / 'c'
WindowsPath('a/b/c')
>>> Path('a') / Path('b')
WindowsPath('a/b')
>>> Path('a').resolve()
WindowsPath('C:/Users/paullab/a')
>>> Path('a').resolve().parent
WindowsPath('C:/Users/paullab')
>>> Path('a').resolve().parent.parent
WindowsPath('C:/Users')
2. 보안 설정
SECRET_KEY = os.environ.get('SECRET_KEY')
SECRET_KEY : Django 프로젝트에서 중요한 보안 설정
프로젝트에서 사용하는 모든 보안 기능에서 사용, 공개되면 보안상의 위험이 높음
일반적으로 SECRET_KEY는 환경 변수로 설정하며 코드에서는 이 값을 가져와 사용함
3. Debug 모드
DEBUG = True
DEBUG : 개발 중에만 사용
에러메시지가 자세히 출력되며 보안상의 위험이 있음, 실제 서비스에서는 DEBUG 모드를 꺼야 함
4. Application 정의
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
INSTALLED_APPS : Django 프로젝트에서 사용할 앱들을 정의
Django에서 제공하는 기본 앱들 (django.contrib.*)과 사용자가 만든 앱들 (예를 들어 myapp)이 포함
이를 통해 Django는 프로젝트에 필요한 기능들을 불러올 수 있음
5. Middleware 정의
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
MIDDLEWARE : HTTP 요청과 응답 사이에 실행되는 함수들의 목록
각 함수는 요청이나 응답에 대한 수정 혹은 추가적인 작업을 수행
ex) SecurityMiddleware는 보안 헤더를 추가하고 SessionMiddleware는 세션을 처리함
6. URL 설정
ROOT_URLCONF = 'myapp.urls'
ROOT_URLCONF : URL 패턴을 정의하는 파일을 지정
Django는 이 파일을 사용하여 요청 URL과 일치하는 View를 찾음
7. Template 설정
+ os 모듈이 해당 버전에 없는 경우
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR /'templates'], # BASE_DIR.joinpath('templates')
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
+ os 모듈이 해당 버전에 있는 경우
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
TEMPLATES : Django 템플릿 시스템에 대한 설정을 구성
BACKEND : 'django.template.backends.django.DjangoTemplates'
= Django 템플릿 시스템의 백엔드로 DjangoTemplates를 사용
DIRS : [os.path.join(BASE_DIR, 'templates')]
= 템플릿을 찾을 경로를 지정, 위 코드에서는 프로젝트의 최상위 디렉터리 아래 templates 폴더가 설정되어 있음
APP_DIRS : True
= 앱 내부의 templates 폴더를 사용하도록 설정
OPTIONS : {...}
= 추가적인 설정을 지정, 위 코드에서는 기본적으로 사용할 콘텍스트 프로세서들을 정의
8. Database 설정
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
DATABASES : Django에서 사용할 데이터베이스를 설정
위 예제에서는 SQLite를 사용하도록 설정
9. 정적 파일 (Static file) 설정
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
STATIC_URL : 정적 파일 (이미지, CSS, JavaScript 등)을 서빙할 때 사용할 URL 경로를 설정
STATICFILES_DIRS : 정적 파일이 위치할 디렉터리를 설정
위 예제에서는 프로젝트 최상위 디렉터리 아래 static 디렉터리가 정적 파일이 위치할 디렉터리로 지정되어 있음
10. 로깅 (Logging) 설정
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'root': {
'handlers': ['console'],
'level': 'INFO',
}
}
LOGGING : Django에서 사용할 로깅 시스템을 설정
애플리케이션의 동작 상황을 기록하는 데 사용되며 오류를 디버깅할 때 매우 유용
11. 언어 및 시간 설정
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
LANGUAGE_CODE : Django에서 사용할 언어 코드를 설정 (ko-kr은 한국어 코드)
TIME_ZONE : 서버가 위치한 시간대를 설정
Django는 기본적으로 UTC를 사용 (Asia/Seoul은 한국 시간대)
Python-Dotenv
+ 둘 중 어떤 것을 사용하더라도 SNS에서 .env 파일을 주고받을 때 앞에 점이 없어졌는지 확인해야 함
= Django 프로젝트에서 환경 변수를 관리하는 데 사용
Django와 같은 웹 프레임워크에서 환경 변수를 사용하는 이유는 보안, 유연성, 환경 구성의 용이성
1. 보안 : 중요한 정보 (예를 들어 데이터베이스 비밀번호, API 키)를 소스 코드에 직접 적지 않고 별도의 환경 파일에 저장
= 중요 정보를 소스 코드와 분리하여 보안을 강화
2. 환경 구분 : 개발, 테스트, 프로덕션 등 다양한 환경에 대해 다른 설정을 적용
로컬 개발 환경과 프로덕션 환경에서 다른 데이터베이스 설정을 사용할 수 있음
3. 환경변수 관리의 용이성 : 환경변수를 .env 파일과 같은 단일 파일에 저장함으로써 환경변수 관리가 용이함
= 필요한 환경변수를 쉽게 추가, 수정, 삭제할 수 있음
4. 포터빌리티 : .env 파일을 사용하면 프로젝트 설정을 다른 시스템으로 쉽게 이전할 수 있음
새로운 개발자가 프로젝트에 참여할 때, 소스 코드와 함께 .env.example 같은 샘플 환경 파일을 제공함으로써 환경 설정을 쉽게 공유 가능
Django 프로젝트에서 Python-Dotenv 사용 방법
1. python-dotenv 라이브러리 설치
pip install python-dotenv
2. .env 파일 생성
= 프로젝트 루트에 .env 파일을 생성하고 필요한 환경변수를 정의
DEBUG=True
SECRET_KEY=your_secret_key
DATABASE_URL=your_database_url
3. Django 설정 파일에서 환경변수 로드
= settings.py 파일에서 python-dotenv를 사용하여 .env 파일의 환경변수를 로드
import os
from dotenv import load_dotenv
load_dotenv() # 환경변수를 로드
SECRET_KEY = os.getenv('SECRET_KEY') # 또는 os.environ.get("SECRET_KEY")
DEBUG = os.getenv('DEBUG') == 'True'
DATABASE_URL = os.getenv('DATABASE_URL')
Django-Environ
1. 목적 : .env 파일뿐만 아니라 다양한 환경 설정 소스 (예를 들어 JSON, YAML)에서 설정을 로드하고 Django의 설정 시스템과 통합하는 것
2. 타입 캐스팅 : 자동으로 타입을 변환하여 환경 변수를 적절한 데이터 타입으로 처리
= 문자열 'True'는 불리언 값 True로 자동 변환
3. 풍부한 기능 : 데이터베이스 URL 파싱, 이메일 설정 처리, 리스트와 튜플로의 자동 변환 등 추가적인 기능을 제공
4. 설정 파일과 통합 : Django의 settings.py 파일에 직접 통합, 다양한 환경 설정을 편리하게 관리 가능
5. 설치 및 사용
+ 1. Django-Environ 설치 : 터미널에서 다음 명령어 실행
pip install django-environ
+ 2. 환경 변수 파일 생성 : 프로젝트의 루트 디렉터리에 .env 파일을 생성, 이 파일에는 다양한 설정 값들이 들어갈 수 있음
DEBUG=True
SECRET_KEY=your_secret_key
DATABASE_URL=postgres://USER:PASSWORD@HOST:PORT/NAME
EMAIL_HOST=smtp.example.com
+ 3. Django 설정 파일에서 Django-Environ 사용 : settings.py 파일에서 django-environ을 사용하여 .env 파일의 설정을 로드
import environ
# 환경 변수 로드
env = environ.Env(
# 기본값 설정
DEBUG=(bool, False)
)
environ.Env.read_env()
# 사용 예시
DEBUG = env('DEBUG')
SECRET_KEY = env('SECRET_KEY')
DATABASES = {
'default': env.db()
}
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = env('EMAIL_HOST')
+ 비교 요약
기능성 : Django-Environ = 타입 캐스팅, 복잡한 설정값 처리 등 보다 풍부한 기능을 제공
간결함 : Python-Dotenv = 더 단순하고 기본적인 환경 변수 로드에 초점