Django: settings.py 분리

GreenBean·2022년 1월 14일
0
post-thumbnail

settings.py 분리

점프 투 장고: 4-06 settings.py 분리

  • 로컬 환경과 서버 환경을 구분해서 서버를 동작시켜야 함
  • 예시
    • 서버 환경에서의 ALLOWED_HOSTS와 로컬 환경에서의 ALLOWED_HOSTS 값을 다르게 설정할 수 있어야 함
    • 물론 ALLOWED_HOSTS 외에 DEBUG, DATABASE 등의 항목들도 서버 환경과 로컬 환경이 다를 수 있을 것

settings.py 분리

settings 디렉터리

  • 로컬 환경에서 settings 디렉터리를 생성
(mysite) c:\projects\mysite>cd config
(mysite) c:\projects\mysite\config>mkdir settings

base.py

  • settings.py 파일을 settings 디렉터리에 base.py라는 이름으로 이동
(mysite) c:\projects\mysite\config>move settings.py settings/base.py
        1개 파일을 이동했습니다.
  • 그리고 base.py 파일의 BASE_DIR 항목을 다음과 같이 수정
# [파일명: C:\projects\mysite\config\settings\base.py]

(... 생략 ...)
BASE_DIR = Path(__file__).resolve().parent.parent.parent
(... 생략 ...)
  • 기존 settings.py 파일의 위치는 C:/projects/mysite/config인데 base.py 파일의 위치는 C:/projects/mysite/config/settings디렉터리가 1 Depth 만큼 더 깊어졌기 때문.parent를 한 번 더 사용하여 BASE_DIR을 설정
  • C:/projects/mysite/config/settings/base.py에서 총 세번의 .parent가 사용되었으므로 BASE_DIR은 결국 C:/projects/mysite가 될 것

local.py

  • 로컬 환경을 담당할 local.py 파일은 다음과 같이 작성
# [파일명: C:\projects\mysite\config\settings\local.py]

from .base import *

ALLOWED_HOSTS = []
  • 로컬 환경에 맞게끔 ALLOWED_HOSTS 항목을 비워 놓았음
  • from .base import *base.py 파일의 모든 내용을 사용한다는 의미
    • 즉, local.py 파일의 내용은 base.py 파일과 동일하지만 ALLOWED_HOSTS만 다르게 설정하겠다는 의미

prod.py

  • 서버 환경을 담당할 prod.py 파일은 다음과 같이 작성
# [파일명: C:\projects\mysite\config\settings\prod.py]

from .base import *

ALLOWED_HOSTS = ['3.35.153.92']
  • prod.py 파일에는 서버 환경에 맞게끔 ALLOWED_HOSTS 항목에 서버의 고정 아이피를 등록
  • 이렇게 수정하면 mysite/config 디렉터리의 구조는 다음과 같을 것

settings 옵션

  • 로컬 환경에서 다음과 같이 서버를 구동해 보면 아래와 같은 오류 발생
    • 장고 서버가 settings.py 파일을 읽지 못했기 때문
(mysite) c:\projects\mysite>python manage.py runserver
Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\venvs\mysite\lib\site-packages\django\core\management\__init__.py", line 401, in 
  (... 생략 ...)    
  raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
  • python manage.py runserver 뒤에 --settings=config.settings.local 라는 옵션을 주면 장고 서버가 잘 동작하는 것을 확인할 수 있음
    • --settings 옵션장고 서버가 읽어야 할 설정파일을 지정하는 옵션
    • --settings=config.settings.local 의 의미는 장고 서버의 설정 파일로 config\settings\local.py 파일을 읽으라는 뜻
(mysite) c:\projects\mysite>python manage.py runserver --settings=config.settings.local
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 23, 2020 - 20:47:17
Django version 3.0.4, using settings 'config.settings.local'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

로컬 설정 자동화

  • DJANGO_SETTINGS_MODULE 환경 변수를 이용하는 방법

DJANGO_SETTINGS_MODULE

  • DJANGO_SETTINGS_MODULE 환경 변수는 장고 서버 실행 시 사용하는 --settings=config.settings.local 옵션을 대신함
    • 즉, 로컬 환경에서는 다음과 같이 장고서버를 실행할 수 있음
(mysite) c:\projects\mysite>set DJANGO_SETTINGS_MODULE=config.settings.local
(mysite) c:\projects\mysite>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 23, 2020 - 20:49:15
Django version 3.0.4, using settings 'config.settings.local'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
  • set DJANGO_SETTINGS_MODULE=config.settings.local 명령으로 DJANGO_SETTINGS_MODULE 환경 변수를 설정하고, python manage.py runserver 명령처럼 --settings=config.settings.local 옵션 없이 장고 서버를 실행하면 --settings 옵션을 사용할 때와 동일하게 작동함을 확인할 수 있음

Tip! mysite.cmd

mysite.cmd

  • DJANGO_SETTINGS_MODULE 환경 변수를 mysite.cmd 파일에 추가하면 더욱 편리하게 개발 환경에서 장고 서버를 구동할 수 있음
# [파일명: C:\venvs\mysite.cmd]

@echo off
cd c:/projects/mysite
set DJANGO_SETTINGS_MODULE=config.settings.local
c:/venvs/mysite/scripts/activate
  • mysite.cmd 파일로 가상 환경에 진입하면 DJANGO_SETTINGS_MODULE 환경 변수가 자동으로 설정되므로 별다른 설정 없이 python manage.py runserver 명령으로 서버를 실행할 수 있음
C:\Users\pahkey>mysite
(mysite) c:\projects\mysite>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 23, 2020 - 20:49:15
Django version 3.0.4, using settings 'config.settings.local'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

서버 환경 설정

  • 서버 환경도 개발 환경에 적용했던 것과 동일한 방법을 사용하면 됨
    • 개발 환경에서 변경된 파일을 서버에 적용
(mysite) c:\projects\mysite>git add *
(mysite) c:\projects\mysite>git commit -m "settings 변경"
(mysite) c:\projects\mysite>git push
  • AWS 서버 터미널에 접속하여 다음 명령을 순서대로 수행
ubuntu@ip-172-26-12-247:~$ cd ~/venvs/mysite/bin
ubuntu@ip-172-26-12-247:~/venvs/mysite/bin$ . activate
(mysite) ubuntu@ip-172-26-12-247:~/venvs/mysite/bin$ cd ~/projects/mysite
(mysite) ubuntu@ip-172-26-12-247:~/projects/mysite$ git pull
  • 가상 환경으로 접속한 후 git pull 명령으로 변경된 내용을 깃허브에서 다운로드
  • 그리고 아래처럼 settings 옵션을 추가하여 서버를 실행하면 서버가 잘 작동할 것
(mysite) ubuntu@ip-172-26-12-247:~/projects/mysite$ python manage.py runserver 0:8000 --settings=config.settings.prod
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 23, 2020 - 20:52:44
Django version 3.0.5, using settings 'config.settings.prod'
Starting development server at http://0:8000/
Quit the server with CONTROL-C.

Tip! mysite.sh

서버 설정 자동화

  • 서버도 개발 환경의 mysite.cmd 파일과 동일하게 mysite.sh 파일을 작성하여 가상 환경 진입과 환경 변수 설정 작업을 자동화할 수 있음
    • 여기서는 nano 편집기 사용
  • 터미널에서 venvs 디렉터리로 이동한 다음 nano mysite.sh 명령을 수행
(mysite) ubuntu@ip-172-26-12-247:~/projects/mysite$ cd /home/ubuntu/venvs/
(mysite) ubuntu@ip-172-26-12-247:~/venvs$ nano mysite.sh
  • nano 편집기에서 아래 내용을 입력하고 <Ctrl+O>를 눌러서 mysite.sh 파일을 저장한 뒤 <Ctrl+X>를 눌러서 편집기를 종료
# [파일명: /home/ubuntu/venvs/mysite.sh]

#!/bin/bash

cd ~/projects/mysite
export DJANGO_SETTINGS_MODULE=config.settings.prod
. ~/venvs/mysite/bin/activate
  • 그리고 터미널에서 mysite.sh 파일을 다음과 같이 실행
ubuntu@ip-172-26-12-247:~/venvs$ . mysite.sh
(mysite) ubuntu@ip-172-26-12-247:~/projects/mysite$ 
  • 이제 mysite.sh 파일을 실행하면 가상 환경 진입과 환경 변수 설정을 자동으로 할 수 있음
    • 이때 . mysite.sh 앞에 있는 점 기호 . 입력을 기억
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글