Django Setting
생성된 blog/blog/settings.py 파일은 다음과 같다.
"""
Django settings for blog project.
Generated by 'django-admin startproject' using Django 3.1.4.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '@o^hi@w%fr5ull0i3p3dsl+7x+#nnn$y3)g1wof$@)e2c4x!0i'
# 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 = 'blog.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 = 'blog.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/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.1/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.1/howto/static-files/
STATIC_URL = '/static/'
Language 및 timezone 설정
LANGUAGE_CODE를 ‘ko-KR’로, TIME_ZONE을 ‘Asia/Seoul’로 변경한다
LANGUAGE_CODE = 'ko-KR'
TIME_ZONE = 'Asia/Seoul'
Config 파일의 분리
settings.py에서 default 데이터베이스는 sqlite3 이다.
Django에서 테스트를 할 경우 별도로 설정하지 않는 한 새로운 테스트 데이터베이스를 생성하여 테스트를 한 후 자동으로 삭제한다.
Mysql이나 PostreSQL을 사용할 경우 데이터베이스 생성 권한이 주어지지 않는 경우가 있으므로 개발 환경은 sqlite3, 운영 환경은 mysql로 설정하기로 한다.
데이터베이스 설정정보와 SECRET_KEY, DEBUG, ALLOWD_HOST등을 기존 settings.py에서 분리하여 개발 설정은 config_dev.py, 운영 설정은 config_op.py로 별도로 설정한다.
- DEBUG=True일 경우, 에러가 발생하면 상세한 디버그 정보를 출력한다. 따라서 민감한 정보가 유출될 수 있으므로 운영환경에서는 False로 설정해야 한다.
- SECRET_KEY는 CRSF 보안 등을 위해 사용되는 랜덤 값이다. git 등을 통해 유출하지 않도록 주의해야 한다.
- ALLOWED_HOST로 접속을 허용하는 IP를 설정할 수 있다.
config 폴더를 생성한 후 아래에 init.py, config_dev.py, config_op.py를 생성한다.
blog/blog/config/config_dev.py
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent.parent
KEY_SET = "dfafafafjaskejrrklafjfo3519fvk8u9fjejfkdalfafjdald"
DATABASE_SET = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
DEBUG_SET = True
HOST_SET = ["*"]
blog/blog/config/config_op.py
import pymysql
pymysql.version_info = (1, 4, 2, "final", 0)
pymysql.install_as_MySQLdb()
KEY_SET = "dfafafafjaskejrrklafjfo3519fvk8u9fjejfkdalfafjdald"
DATABASE_SET = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "데이터베이스명",
"USER": "아이디",
"PASSWORD": "패스워드",
"HOST": "데이터베이스IP/엔드포인트",
"PORT": "일반적으로 3306 또는 3307",
}
}
DEBUG_SET = True
HOST_SET = ["*"]
참고로 Django에서 mysql 연결은 mysqlclient를 추천하고 있다.
그러나 MacOS에서 에러가 발생하는 이슈가 있어 pymysql로 변경하였다.
django 3.1.2에서는 mysqlclient 1.4.0 이상을 요구하므로 pymysql.version_info = (1, 4, 2, "final", 0)
를 추가해야 한다.
pymysql 패키지를 설치한다.
pip install pymysql
보안을 위해 .gitignore에 다음을 추가한다.
config.py
config_op.py
config_dev.py
config를 반영한 settings.py는 다음과 같다.
blog/blog/config/config.py에 config_dev.py나 config_op.py의 내용을 필요에 따라 수정하는 방식으로 고안했다.
blog/blog/settings.py
from .config.config import DATABASE_SET, KEY_SET, DEBUG_SET, HOST_SET
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = KEY_SET
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = DEBUG_SET
ALLOWED_HOSTS = HOST_SET
...
DATABASES = DATABASE_SET
위의 방식은 필자가 임의로 만든 방식이다.
필요에 따라 config.py에 config_dev.py나 config_op.py의 내용을 붙여 넣어야 하는 번거러움이 있다.
다양한 설정 방식에 대해서는 아래의 링크를 참고하기 바란다.
Django: How to manage development and production settings? - Stack Overflow
지금까지의 소스코드는 이 곳에서 참고할 수 있다.