WeniVooks

검색

Django 베이스캠프

settings

Django 프로젝트 구조에서 settings.py 파일은 아주 중요한 역할을 가지고 있습니다. 이 파일은 프로젝트의 설정을 담당하는 파일로 프로젝트 전체에서 사용되는 설정을 정의하게 됩니다.

1. Settings.py 파일 구조

settings.py 파일은 다음과 같은 내용을 포함하고 있습니다.

1.1 경로 상수
BASE_DIR = PATH(__file__).resolve().parent.parent
BASE_DIR = PATH(__file__).resolve().parent.parent

BASE_DIR: BASE_DIR 상수는 프로젝트의 최상위 디렉토리를 의미합니다. 이 상수를 사용하면 다른 경로들을 계산하는 데 유용합니다.

기존에는 os 모듈을 사용하다가 window에서 몇 가지 문제점이 발견(리눅스와 윈도우가 구분자가 달라 생기는 배포 문제)되면서 3.x 버전부터 Path 라이브러리를 사용하기 시작했습니다. 구버전에서는 os 모듈을 만나실 수 있습니다. 다만 인터넷 블로그에서 코드를 그대로 복사 붙여넣기 하다보면 os모듈과 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')
>>> 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')
1.2 보안 설정
SECRET_KEY = os.environ.get('SECRET_KEY')
SECRET_KEY = os.environ.get('SECRET_KEY')

SECRET_KEY는 Django 프로젝트에서 중요한 보안 설정입니다. 이 값은 프로젝트에서 사용하는 모든 보안 기능에서 사용되며, 공개되면 보안상의 위험이 큽니다. 이러한 이유로, 일반적으로 SECRET_KEY는 환경 변수로 설정하고, 코드에서는 이 값을 가져와 사용합니다.

1.3 Debug 모드
DEBUG = True
DEBUG = True

DEBUG 모드는 개발 중에만 사용해야 합니다. 이 모드에서는 에러 메시지가 자세하게 출력되며, 보안상의 위험이 있습니다. 따라서 실제 서비스에서는 DEBUG 모드를 꺼야 합니다.

1.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.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]

INSTALLED_APPS는 Django 프로젝트에서 사용할 앱들을 정의합니다. Django에서 제공하는 기본 앱들(django.contrib.*)과 사용자가 만든 앱들(ex. myapp)이 포함됩니다. 이를 통해 Django는 프로젝트에 필요한 기능들을 불러올 수 있습니다.

1.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 = [
    '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 요청과 응답 사이에 실행되는 함수들의 목록입니다. 각 함수는 요청이나 응답에 대한 수정 혹은 추가적인 작업을 수행합니다. 예를 들어, SecurityMiddleware는 보안 헤더를 추가하고, SessionMiddleware는 세션을 처리합니다.

1.6 URL 설정
ROOT_URLCONF = 'myapp.urls'
ROOT_URLCONF = 'myapp.urls'

ROOT_URLCONF는 URL 패턴을 정의하는 파일을 지정합니다. Django는 이 파일을 사용하여 요청 URL과 일치하는 뷰를 찾습니다.

1.7 Template 설정
  • 신버전(3.x 이후)
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',
            ],
        },
    },
]
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',
            ],
        },
    },
]
  • 구버전(3.x 이전)
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 = [
    {
        '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': {...}: 추가적인 설정을 지정합니다. 위 코드에서는 기본적으로 사용할 컨텍스트 프로세서들을 정의합니다.
1.8 Database 설정
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

DATABASES는 Django에서 사용할 데이터베이스를 설정합니다. 위 예제에서는 SQLite를 사용하도록 설정되어 있습니다.

1.9 정적 파일(Static file) 설정
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']

STATIC_URL은 정적 파일(이미지, CSS, JavaScript 등)을 서빙할 때 사용할 URL 경로를 설정합니다. STATICFILES_DIRS는 정적 파일이 위치할 디렉토리를 설정합니다. 위 예제에서는 프로젝트 최상위 디렉토리 아래 static 디렉토리가 정적 파일이 위치할 디렉토리로 지정되어 있습니다.

🧐 해당 경로명 설정에서 Django 버전 3.x에서는 os 모듈이 제거되었습니다. 그 이전 버전에서는 os모듈을 사용하고 있습니다.

1.10 로깅(Logging) 설정
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO',
    }
}
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO',
    }
}

LOGGING은 Django에서 사용할 로깅 시스템을 설정합니다. 로그는 애플리케이션의 동작 상황을 기록하는데 사용되며, 오류를 디버깅할 때 매우 유용합니다.

1.11 언어 및 시간 설정
LANGUAGE_CODE = 'ko-kr'
 
TIME_ZONE = 'Asia/Seoul'
LANGUAGE_CODE = 'ko-kr'
 
TIME_ZONE = 'Asia/Seoul'

LANGUAGE_CODE는 Django에서 사용할 언어 코드를 설정합니다. 위 예제에서는 한국어 코드인 ko-kr로 설정되어 있습니다.

TIME_ZONE은 서버가 위치한 시간대를 설정합니다. Django는 기본적으로 UTC를 사용하며, 위 예제에서는 한국 시간대인 Asia/Seoul로 설정되어 있습니다.

2. 환경 변수 관리

2.1 python-dotenv

💡 둘 중 어느 것을 사용하시더라도 SNS에서 .env 파일을 주고 받으실 때에는 앞에 점이 없어졌는지 확인해주셔야 합니다.

Python-dotenv는 Django 프로젝트에서 환경 변수를 관리하는 데 사용됩니다. Django와 같은 웹 프레임워크에서 환경 변수를 사용하는 이유는 다음과 같습니다. 자주 사용하는 모듈이니, 프로젝트를 할 때 참고하세요.

  1. 보안: 중요한 정보(예: 데이터베이스 비밀번호, API 키)를 소스 코드에 직접 적지 않고 별도의 환경 파일에 저장합니다. 이렇게 함으로써 중요 정보를 소스 코드와 분리하여 보안을 강화할 수 있습니다.
  2. 환경변수 관리의 용이성: 환경변수를 .env 파일과 같은 단일 파일에 저장함으로써, 환경변수 관리가 용이해집니다. 이 파일을 통해 필요한 환경변수를 쉽게 추가, 수정, 삭제할 수 있습니다.

Django 프로젝트에서 python-dotenv를 사용하는 방법은 다음과 같습니다.

  1. python-dotenv 라이브러리 설치:

    pip install python-dotenv
    pip install python-dotenv
  2. .env 파일 생성: 프로젝트 루트에 .env 파일을 생성하고, 필요한 환경변수를 정의합니다.

    DEBUG=True
    SECRET_KEY=your_secret_key
    DATABASE_URL=your_database_url
    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')
    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')
2.2 django-environ

python-dotenv 뿐만 아니라 환경 변수를 관리하는 여러 라이브러리가 있습니다. 그 중에서 django-environ은 Django 프로젝트에서 다양한 종류의 환경 변수 파일을 관리하는 데 사용됩니다. JSON, YAML 등 다양한 환경 설정 소스에서 설정을 로드하기 좋습니다. 또한 데이터베이스 URL 파싱, 이메일 설정 처리, 리스트와 튜플로의 자동 변환 등 추가적인 기능을 제공합니다.

설치 및 사용:

  1. 1단계: django-environ 설치

    먼저, django-environ을 설치해야 합니다. 터미널에서 다음 명령어를 실행합니다:

    pip install django-environ
    pip install django-environ
  2. 2단계: 환경 변수 파일 생성

    프로젝트의 루트 디렉토리에 .env 파일을 생성합니다. 이 파일에는 다양한 설정 값들이 들어갈 수 있습니다. 예를 들면:

    DEBUG=True
    SECRET_KEY=your_secret_key
    DATABASE_URL=postgres://USER:PASSWORD@HOST:PORT/NAME
    EMAIL_HOST=smtp.example.com
    DEBUG=True
    SECRET_KEY=your_secret_key
    DATABASE_URL=postgres://USER:PASSWORD@HOST:PORT/NAME
    EMAIL_HOST=smtp.example.com
  3. 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')
    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는 더 단순하고 기본적인 환경 변수 로드에 초점을 맞추고 있습니다.

3. settings에 없는 변수

settings.py 파일에는 Django 프로젝트 전체에서 사용되는 설정들이 포함되어 있습니다. 그러나 프로젝트에서 사용하는 설정이 settings.py 파일에 없는 경우가 있습니다. 이런 추가적인 설정들 중 몇 가지 중요한 것들을 살펴보겠습니다. 자주 사용하는 것만 살펴보겠습니다.

  1. 인증(AUTH) 관련 설정

    • AUTH_USER_MODEL: 사용자 모델을 지정합니다. 기본값은 'auth.User'입니다. app_name.ModelName 형식으로 지정합니다.
    • LOGIN_URL: 로그인 페이지의 URL을 지정합니다.
    • LOGIN_REDIRECT_URL: 로그인 성공 후 리다이렉트될 URL을 지정합니다.
    • LOGOUT_REDIRECT_URL: 로그아웃 후 리다이렉트될 URL을 지정합니다.
  2. 보안 관련 설정

    • ALLOWED_HOSTS: 서비스를 제공할 도메인 목록을 지정합니다.
    • CSRF_COOKIE_SECURE: CSRF 쿠키를 HTTPS 연결에서만 전송할지 여부를 지정합니다.
    • SESSION_COOKIE_SECURE: 세션 쿠키를 HTTPS 연결에서만 전송할지 여부를 지정합니다.
  3. 파일 업로드 관련 설정

    • MEDIA_URL: 업로드된 미디어 파일의 URL 접두사를 지정합니다.
    • MEDIA_ROOT: 업로드된 파일이 저장될 디렉토리의 절대 경로를 지정합니다.
  4. 캐시 관련 설정

    • CACHES: 캐시 백엔드 설정을 지정합니다.
  5. 국제화 및 지역화 관련 설정

    • USE_I18N: 국제화 시스템을 활성화할지 여부를 지정합니다.

이러한 설정들은 프로젝트의 요구사항에 따라 추가하거나 수정할 수 있습니다. 서드파티 앱을 사용하는 경우, 해당 앱의 설정을 참고하여 추가적인 설정을 지정할 수 있습니다.

6장 부록6.2 settings 실습