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로 별도로 설정한다.


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 settings

Django: How to manage development and production settings? - Stack Overflow


지금까지의 소스코드는 이 곳에서 참고할 수 있다.