Python Django 강좌 : 제 3강 - 프로젝트 설정
Django setting.py 설정
장고(Django)의 환경 설정은 setting.py
파일에서 관리할 수 있습니다.
환경 설정에서 데이터베이스
, 디버그 모드
, 허용 가능한 호스트
, 애플리케이션
다국어 및 지역 시간
등을 설정할 수 있습니다.
settings.py
파일의 설정이 올바르지 않거나, 필요한 구성이 누락되었다면 정상적으로 실행되지 않습니다.
장고의 기본적인 설정 파일의 구성은 다음과 같습니다.
"""
Django settings for daehee project.
Generated by 'django-admin startproject' using Django 3.0.7.
For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '비밀 키'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
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',
]
ROOT_URLCONF = 'daehee.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
WSGI_APPLICATION = 'daehee.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/'
기본 디렉토리 경로
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
기본 디렉토리 경로는 BASE_DIR
로 나타냅니다.
BASE_DIR
은 임의적으로 디렉토리 경로를 수정한 경우가 아니라면 수정하지 않습니다.
비밀 키
SECRET_KEY = '비밀 키'
SECRET_KEY
는 무작위의 50 글자로 구성되어 있으며, 암호화 서명(Cryptographic signing)
, 쿠키 데이터 해시
, 유저의 비밀번호 초기화
, 일회성 비밀 URL 생성
등에 사용됩니다.
SECRET_KEY
는 노출되어서는 안되며, SECRET_KEY
키가 노출되었을 때는 보안 기능이 상실되므로, 새로운 SECRET_KEY
를 사용해야 합니다.
SECRET_KEY
의 값은 분리해서 사용하며, 크게 환경 변수에 등록
하거나 비밀 파일로 저장
해 사용합니다.
비밀 키 분리 방법 (1)
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
환경 변수를 .bash_profile
, .profile
에 등록해서 사용할 수 있습니다.
Windows
의 경우에는 명령 프롬프트의 set
에서 Mac
이나 Linux
는 터미널의 export
명령어로 등록할 수 있습니다.
비밀 키 분리 방법 (2)
from keyfile import secret_key
SECRET_KEY = secret_key
간단하게 *.py
파일을 생성한 다음, 변수로 등록해 사용하거나, json
파일에 SECRET_KEY
값을 저장한당므 불러와 사용할 수 있습니다.
이때, git
과 같은 버전관리 시스템을 사용한다면, .gitignore
에 해당 파일을 추가해 저장되지 않도록 합니다.
디버그 모드
DEBUG = True
디버그 모드는 프로그램을 개발할 때 사용되는 모드입니다.
True
로 설정되어 있다면, 특정 행동을 수행할 때마다 로그(Log)
를 표시합니다.
로그를 표시하게 되므로, 모든 데이터가 노출될 수 있습니다.
개발이 완료되고 운영
서버 등에 배포할 때는 필히 디버그 모드를 False
로 사용해야 합니다.
허용 가능한 호스트
ALLOWED_HOSTS = []
허용 가능한 호스트는 운영 서버 등에 배포하여, 서비스할 때 호스트로 사용 가능한 호스트
또는 도메인
목록입니다.
서비스할 웹 사이트의 도메인이 등록되어 있지 않다면, Bad Request (400)
를 반환합니다.
해당 기능은 CSRF(Cross-site request forgery)
와 HTTP 웹 서버 헤더 공격
을 막기 위한 조치입니다.
DEBUG = True
일 때 동작하며, 기본적으로 localhost
, 127.0.0.1
는 등록해 사용합니다.
또한, 서비스하는 도메인을 등록해야 정상적으로 동작합니다. 구성은 아래와 같이 사용할 수 있습니다.
ALLOWED_HOSTS = ['localhost', '127.0.0.1', '076923.github.io']
ALLOWED_HOSTS
에 로컬 호스트를 등록하지 않는다면, CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
의 오류를 반환하며 manage.py runserver
가 작동하지 않습니다.
- Tip : 모든 호스트를 허용한다면
ALLOWED_HOSTS = ['*']
으로 설정합니다.
설치된 애플리케이션
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
현재 장고 프로젝트에 설치된 애플리케이션의 목록을 의미합니다.
애플리케이션을 등록하지 않는다면 서비스에서 사용할 수 없습니다.
현재 프로젝트는 REST Framework
와 CORS
패키지를 등록할 예정이므로 아래와 같이 추가합니다.
애플리케이션 등록
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'앞으로 추가할 애플리케이션',
]
rest_framework
와 corsheaders
는 1강에서 설치한 Django Rest Framework
와 Django CORS
입니다.
해당 애플리케이션을 등록하지 않는다면, 장고 프로젝트에서 위의 기능을 사용할 수 없습니다.
앞으로 추가할 애플리케이션
은 startapp
명령어를 통해 생성된 Python
모듈 파일을 의미합니다.
추가되는 애플리케이션은 모두 INSTALLED_APPS
목록에 추가해야합니다.
- Tip :
startapp
명령어는 앞으로 배울앱 생성 강좌
에서 확인할 수 있습니다.
CORS 허용
CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = False
CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'허용할 메서드',
)
CORS_ORIGIN_WHITELIST = (
'허용할 URL',
)
CORS
를 설정했다면, 위와 같은 내용을 추가합니다.
CORS_ORIGIN_ALLOW_ALL
은 모든 사이트들의 HTTP 요청을 가능하게 합니다. 개발 중에는 DEBUG
처럼 True
로 사용합니다.
서비스 중인 서버에서는 False
로 사용하고, CORS_ORIGIN_WHITELIST
를 설정합니다.
CORS_ALLOW_CREDENTIALS
은 쿠키가 사이트 간 HTTP 요청에 포함 허용 여부를 설정합니다.
CORS_ALLOW_HEADERS
는 Access-Control-Allow-Headers를 포함하는 예비 요청(preflight request) 응답에 사용되는 헤더를 설정합니다.
허용되지 않는 헤더는 CORS
오류를 발생시킵니다. 자주 사용되는 content-type이나 authorization 등의 포함 여부를 확인합니다.
CORS_ALLOW_METHODS
는 사용 가능한 HTTP 메서드를 설정합니다.
CORS_ORIGIN_WHITELIST
는 사이트 간 요청을 허용하는 호스트 목록을 의미합니다.
미들웨어
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)
란 운영 체제와 응용 소프트웨어의 중간에서 조정과 중개의 역할을 수행하는 소프트웨어입니다.
데이터
, 애플리케이션 서비스
, 인증
, API
를 관리합니다.
장고의 미들웨어는 장고에서 발생하는 요청
및 응답
처리에 연결되는 프레임워크입니다.
미들웨어 등록
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'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',
]
장고에서 CORS
를 허용하기 위해서는 목록의 가장 최상단에 CORS
미들웨어를 등록해야 합니다.
추가적으로 등록되는 미들웨어는 하단
에 등록해도 무방합니다.
루트 URL
ROOT_URLCONF = 'daehee.urls'
루트 URL 설정에 대한 Python 경로를 나타내는 문자열입니다.
루트 URL 경로 설정으로 장고 프로젝트의 URL
설정값을 가져와 등록합니다.
템플릿
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
장고는 웹 사이트에서 활용할 수 있으므로 html
코드 등과 연동하여 사용할 수 있습니다.
BACKEND
는 사용할 템플릿 백엔드를 설정합니다. 아래와 같이 템플릿을 변경해 사용할 수 있습니다.
- ‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’
- ‘BACKEND’: ‘django.template.backends.jinja2.Jinja2’
DIRS
은 장고가 템플릿 소스 파일을 찾아야하는 디렉터리 경로입니다.
APP_DIRS
은 장고가 설치된 애플리케이션에서 템플릿 소스 파일을 찾는 여부입니다.
OPTIONS
는 템플릿 백엔드에 전달할 추가 매개 변수입니다. 사용 가능한 매개 변수는 템플릿 백엔드에 따라 달라집니다.
템플릿 등록
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',
],
},
},
]
템플릿을 사용하는 경우 DIRS
에 템플릿이 저장된 경로를 등록합니다.
현재 프로젝트 경로의 templates
폴더에서 템플릿을 검색합니다.
만약, 템플릿을 사용하지 않는다면 등록하지 않아도 됩니다.
WSGI 배포
WSGI_APPLICATION = 'daehee.wsgi.application'
현재 프로젝트를 서비스하기 위해 WSGI(Web Server Gateway Interface)의 경로를 의미합니다.
환경변수가 설정되지 않으면 프로젝트를 생성할 때 제공되는 wsgi.py
의 설정값을 사용합니다.
데이터베이스 설정
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
기본값으로 SQLite
가 설정되어 있으며, 특정 데이터베이스를 연동할 때 DATABASE
설정값을 변경합니다.
ENGINE
은 데이터베이스의 엔진을 의미하며, MySQL
이나 PostgreSQL
등을 연동할 수 있습니다.
MySQL 연동
pip install mysqlclient
MySQL
을 연동하기 위해서는 mysqlclient
을 설치합니다.
'ENGINE': 'django.db.backends.mysql'
설치가 완료된 후, ENGINE
값을 수정해 사용할 수 있습니다.
PostgreSQL 연동
pip install psycopg2
PostgreSQL
을 연동하기 위해서는 psycopg2
을 설치합니다.
'ENGINE': 'django.db.backends.postgresql'
설치가 완료된 후, ENGINE
값을 수정해 사용할 수 있습니다.
데이터베이스 설정 수정
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': db_host,
'PORT': db_port,
'NAME': db_name,
'USER': db_user,
'PASSWORD': db_password,
}
}
데이터베이스를 연동시, 호스트(HOST)
, 포트(PORT)
, 이름(NAME)
, 유저(USER)
, 비밀번호(PASSWORD)
를 설정해야합니다.
호스트(HOST)
는 데이터베이스의 주소입니다. 만약, 로컬에서 사용하고 있다면, localhost
를 입력합니다.
포트(PORT)
는 데이터베이스의 포트 번호입니다. 데이터베이스에서 사용하고 있는 포트 번호를 작성합니다.
이름(NAME)
은 연동할 데이터베이스의 이름을 의미합니다. 사용할 데이터베이스의 이름을 입력합니다.
유저(USER)
는 데이터베이스에 접속할 계정 이름을 의미합니다.
비밀번호(PASSWORD)
는 접속할 데이터베이스에 설정된 비밀번호를 의미합니다.
데이터베이스 설정은 SECRET_KEY
와 같이 별도로 관리해야 합니다.
데이터베이스의 값이 노출된다면, 보안 기능이 상실되므로 큰 위험을 초래하게 됩니다.
클라우드 데이터베이스 연동
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': daehee.076923.ap-northeast-2.rds.amazonaws.com,
'PORT': 5432,
'NAME': db_name,
'USER': db_user,
'PASSWORD': db_password,
}
}
AWS RDS와 같이 클라우드 환경의 데이터베이스와 장고를 연동할 수 있습니다.
클라우드 데이터베이스의 엔드포인트
를 호스트(HOST)에 입력합니다.
클라우드 데이터베이스의 포트
를 포트(PORT)에 입력합니다.
위의 예시와 같이 연동해 사용할 수 있습니다.
비밀번호 유효성 검사
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
사용자 비밀번호의 강도를 확인하는 데 사용되는 유효성 검증기 목록
입니다.
UserAttributeSimilarityValidator
는 사용자의 아이디나 이메일의 속성이 비밀번호와 유사한지 확인합니다.
MinimumLengthValidator
는 비밀번호의 최소 길이를 확인합니다.
CommonPasswordValidator
는 비밀번호가 흔한 문자열인지 확인합니다.
NumericPasswordValidator
는 비밀번호가 숫자로만 구성되어있는지 확인합니다.
다국어 및 지역 시간 설정
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGE_CODE
는 장고 프로젝트에서 사용되는 국가를 설정합니다.
TIME_ZONE
은 데이터베이스의 시간대를 설정하는 문자열입니다.
USE_I18N
은 장고의 번역 시스템 활성화 여부를 설정합니다.
USE_L10N
은 현지화 된 데이터 형식의 사용 여부를 설정합니다.
USE_TZ
은 장고가 시간대를 인식하는 여부를 설정값입니다.
-
Tip :
I18N
은국제화(Internationalization)
의 약어입니다. -
Tip :
L10N
은지역화(localization)
의 약어입니다.
다국어 및 지역 시간 변경
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_L10N = True
USE_TZ = True
다국어 및 지역시간을 한국 시간대에 맞춘다면, 위와 같이 변경해 사용합니다.
정적 파일 설정
STATIC_URL = '/static/'
STATIC_URL
은 정적 파일을 참조 할 때 사용할 URL을 의미합니다.
CSS, JavaScript, Media와 같은 정적 파일 경로를 설정합니다.
비어 있지 않은 값으로 설정되면 슬래시(/)로 끝나야합니다.
정적 파일 경로 변경
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
로컬 경로의 정적 파일을 사용한다면, 위와 같이 변경해 사용할 수 있습니다.
STATICFILES_DIRS
정적 파일이 위치한 경로 목록를 설정합니다.
기타 설정
이외에도 접근 가능한 IP인 ALLOW_IPS
나, 크론 작업 CRONJOBS
등을 추가할 수 있습니다.
일반적으로 해당 강좌에 설명된 설정을 활용합니다.
만약, 데이터베이스를 사용하지 않고 API
등의 기능등만 활용할 때에는 DATABASES
속성을 삭제해 사용할수도 있습니다.
DATABASES
가 없는 경우, 데이터베이스에 연결하지 않고 사용할 수 있습니다.
공유하기


댓글 남기기