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