저번 글에서 Client에게 받은 정보를 DB에 저장하는 실습(게시판에 글 작성)을 하였고 이에 따라 장고가 어떤 흐름으로 동작하는지 확인해보았다.
이번에는 settings.py에 대해서 분석해보겠다.
settings.pysettings.py에서는 의미 그대로 장고 프로그램에 관한 설정을 다룬다.
BASE_DIR: 현재 프로젝트 파일의 루트폴더의 위치, 즉 프로젝트가 위치한 곳을 의미한다.
참고로 장고 2.XX버전에서는 os.path로 경로가 지정됐었는데, 3.XX로 넘어오면서 pathlib를 이용해서 경로를 지정한다. os.path는 경로를 문자열로 다루지만 Path는 경로를 객체로 다룬다고 한다.
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
이에 대해 더 자세히 알고 싶다면 이 글을 참고하면 된다.
간단하게 얘기해서 장고 웹서버에서 인증이 필요한 부분에 사용되는 비밀키라고 생각하면 된다.
이 SECRET_KEY는 서비스 제공시 절대 노출되어서는 안되는 값이며 이 다른 파일로 따로 빼서 관리할 수 있다.
SECRET_KEY = '프로젝트 생성마다 생기는 비밀 키'
SECRET_KEY에 대한 자세한 정보는 공식문서에서 찾아볼 수 있다.
흔히 디버깅모드라고 생각하면 된다.
프로젝트를 생성하면 Default값이 True로 설정되어 있으며 오류 발생 시 오류가 어느 부분에서 어떤 오류가 발생 하였는지 구체적으로 알려준다.
DEBUG = True
이 설정 역시 배포할 때는 False로 바꾸고 배포를 진행해야 한다.
의미 그대로 허용된 호스트들, 즉, 접속을 허용할 호스트들(도메인)을 이 곳에 등록해주어야 한다.
ALLOWED_HOSTS = []
Default값은 빈 리스트이지만 DEBUG = True인 상태에서는 자동적으로 localhost와
127.0.0.1이 접속가능한 호스트들로 등록되어 있다.
만약 배포 직전 DEBUG = False로 바꾼다면 이곳에 도메인을 등록해주어야한다.
역시 자세한 사항은 공식문서를 확인하자.
INSTALLED_APPS우리가 프로젝트 안에 생성한 앱, 그리고 기본으로 설치된 앱 이외에 별도로 설치한 앱들은 이곳에 명시해주어야만 장고에서 사용할 수 있다.
우리가 이미 이전 포스트에서 확인했던 코드이다.
INSTALLED_APPS = [
#기본으로 설치된 앱
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#우리가 생성된 앱
'posts',
]
기본으로 명시된 앱들에 관한 설명은 이 글을 참조하자.
MIDDLEWARE우선 공식문서를 참고했을 때 정의는 다음과 같다.
MIDDLEWARE: Django의 요청 / 응답 처리에 대한 후크 프레임 워크로써 Django 상의 모든 API 입출력을 전역적으로 변경하기 위한 low-level의 플러그인 시스템이다.
지금까지 우리가 다룬 수준에서 장고의 동작흐름을 살펴보면 다음과 같다.
Client가 특정 url로request요청- 장고 내부에서 url에 해당하는 view 동작
view에서Client로request에 대한Response반환
사실 1번, 2번, 3번 각 순서 사이에 요청과 응답이 상황에 맞게 전처리되는 과정은 빠져있다. 이 전처리를 해주는 역할을 MIDDLEWARE가 해준다고 생각하면 된다.
#순서가 뒤바뀌면 안됨
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이외에도 우리가 직접 Custom을 하여 추가할 수도 있다. 이 부분은 추후에 다루고 여기선 이 정도의 개념만 알고 넘어가겠다.
참고 : cors 에러 해결하기
기준이 되는 URL파일의 경로를 의미한다.
ROOT_URLCONF = 'config.urls'
실제 이 경로가 바로 우리가 프로젝트를 생성했을 때 만들어지는 config의 urls.py라는 것을 알 수 있다.
장고에서 제공하는 템플릿에 관한 기능들을 정의하는 내용이 담겨져있다.
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',
],
},
},
]
각각의 세부적인 사항은 이 글을 통해서 확인할 수 있다.
import os
"생략"
'DIRS' : [os.path.join(BASE_DIR, 'templates')]
이렇게 경로를 지정해서 Base템플릿을 사용할 수 있다.
우선 WSGI에 대해서 알아볼 필요가 있다.
WSGI: Web Server Gateway Interface의 줄임말이다.웹 서버에 동적 요청이 발생하면웹 서버가WSGI 서버를 호출하고 다시 그WSGI 서버는 파이썬 프로그램을 호출하여 동적 페이지 요청을 처리한다.
쉽게 얘기해서 정의 그대로 웹서버와 파이썬 프로그램 중간에서 통신을 도와주는 Gateway인 셈이다. 대부분의 웹 서버는 파이썬 프로그램을 호출할 수 없기 때문이다.
WSGI_APPLICATION = 'config.wsgi.application'
settings.py에는 이렇게 config의 wsgi.py의 위치가 정의되어있는 것을 확인할 수 있다. 개발을 하면서 이 부분을 건들 일은 딱히 없다. 더 구체적인 설명은 이 곳을 참고하기 바란다.
이 곳에는 DATABASE에 관련된 설정들이 들어있다.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
프로젝트를 생성하고 아무것도 변경하지 않으면 장고는 sqlite3을 이용하여 DATABASE를 생성한다. 만약 다른 DATABASE를 사용하면 설정이 바뀌게 되는데 이 것은 추후에 업로드 하겠다.
이 곳은 의미 그대로 비밀번호의 복잡도에 관한 내용이 들어있다.
AUTH_PASSWORD_VALIDATORS = [
{
#username과 비밀번호가 유사한지 확인
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
#비밀번호의 최소 자리수(default)를 지정해준다.
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
#commmon한 비밀번호(ex. qwer) 1000개의 리스트와 비교함
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
#전부 숫자인 비밀번호는 사용하지 못하게 한다.
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
장고로 개발을 하면서 admin페이지에 들어가기 위해서는 아래 명령어로 관리자 계정을 만들어야 한다.
python manage.py createsuperuser
이 때 만들어지는 계정의 비밀번호가 위의 규칙을 따른다. 추후에 회원가입/로그인을 구현할때도 위 라이브러리를 사용하면 편할 듯 하다.
LANGUAGE_CODE = 'en-us'
웹페이지에 표시하고자 하는 언어를 설정하는 변수이다. 만약 한글로 표시하고 싶다면 default로 지정되어있는 'en-us'를 'ko-kr'로 변경해주면 된다.
TIME_ZONE = 'UTC'
이 부분은 시스템의 시간대를 설정하는 부분이다. 'UTC'는 한국시간의 -9시간인 그리니치 시간대로 만약 한국 시간으로 바꾸고 싶다면 'Asia/Seoul'로 지정해주면 된다.
USE_I18N = True
장고의 번역 시스템 활성화 여부를 나타낸다.
참고로 I18N은 국제화(Internationalization)의 약자이다.
USE_TZ = True
Timezone의 사용여부를 정한다.
False면 모든 datetime들을 표시하고 True면 template과 form에만 적용된다.
즉 DB에 저장되는 정보도 한국 시간대로 사용하려면 이 부분을 False로 지정해주어야 한다.
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_TZ = False
STATIC_URL = 'static/'
static파일들의 경로를 지정하는데 사용된다.
장고에서 말하는 static파일들은 자바스크립트, css, 이미지 등을 의미하며 템플릿에서 이 경로를 타고 들어가 static파일들을 불러올 수 있다.
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
직역하자면 기본적으로 자동생성되는 필드를 BigAutoField를 사용한다는 의미이다.
말 그대로의 의미이며 실제로 장고에서 모델을 생성하고 migrate를 진행하면 테이블의 pk로 ID가 auto_increament key로 자동생성된다.
지금까지 프로젝트를 진행하면서 settings.py에서 다룬 내용은 아래에서 크게 벗어나지 않았다.
DB관련 설정INSTALLED_APPS에 설치한 앱, 생성한 앱 추가DB password/secret-key분리- 언어/시간대 설정
- 기타 Default 설정(ex.
DRF)
특히 MIDDLEWARE, WSGI에 대해서는 이번에 내용을 정리하면서 대략적으로 알 수 있었다. 개발을 할 때 많은 비중을 다루는 부분은 아니라 넘어갔었는데 다음엔 이 두 개에 대해서도 자세히 다뤄봐야겠다.