Python Django 강좌 : 제 3강 - Django 프로젝트 설정

Python Django Project Settings

Python Django 강좌 : 제 3강 - Django 프로젝트 설정
[ Python-Django ] - 윤대희

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 FrameworkCORS 패키지를 등록할 예정이므로 아래와 같이 추가합니다.


애플리케이션 등록

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'corsheaders',
    '앞으로 추가할 애플리케이션',
]

rest_frameworkcorsheaders는 1강에서 설치한 Django Rest FrameworkDjango 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가 없는 경우, 데이터베이스에 연결하지 않고 사용할 수 있습니다.


도움이 되셨다면 광고 클릭 부탁드립니다.


Book Image

책이 출간되었습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C# OpenCvSharp4
  • Python OpenCV4
  • Using Tesseract
  • Using TensorFlow
  • Using Regular Expression
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]


    ⤧  Previous post Python Django 강좌 : 제 2강 - Django 프로젝트 생성 ⤧  Next post Python Django 강좌 : 제 4강 - Django 애플리케이션 생성
    Python-Django Category