혼복필 2024. 3. 26. 18:09
728x90
300x250
SMALL

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 = 더 단순하고 기본적인 환경 변수 로드에 초점

728x90
300x250
LIST