기존처럼 settings.py를 하나로 사용하게 되면 개발 시
DEBUG값을 true 로 두었다가 배포할때 false로 바꾸어야 하는 번거로움이 있습니다.
이외에도 환경마다 설정을 일일이 달리해야하는 등의 불편함도 있습니다.
settings.py를 분리하게 되면 몇가지 장점들이 있는데 다음과 같습니다.
환경마다 settings.py 설정 및 적용을 달리할 수 있다는 장점때문에
settings.py를 쪼갤때는 공개여부
에 따라 파일을 분리합니다.
모든 환경에서 공통적으로 사용되는 공개 설정은 base.py 라는 파일에 작성하고 환경에 따라 설정을 달리 작성할 때는 local(development).py,production.py를 활용합니다.
비공개 설정은 대부분 환경변수를 활용합니다. 설정값에 환경변수를 로드하여
공개여부를 설정할 수 있습니다. 공개적인 설정은 레포지토리에서 저장되지만,
비공개 설정은 gitignore에 반드시 추가하여 관리해야 합니다.
development.py
베이스를 전부 임포트해와서 상속받은 뒤, debug는 true로,
database는 개발용 임시db(default)로 정의해줍니다.
이때는 debug가 true이므로 allowed_host엔 자동으로 로컬주소가 입력됩니다.
production.py
베이스를 전부 임포트해와서 상속받은 뒤, debug는 false로, database는 배포용 데이터베이스로 정의해줍니다. 추가적으로 allowed_host에 실제로 런칭할 서비스의 웹사이트 도메인을 추가하여, 권한을 도용하여 중요기능을 실행시키는 CSRF 공격
으로부터 웹사이트를 보호합니다.
이는 debug가 false값일때 활성화되며 allowed_host에 도메인이 추가되어있지 않으면 Disallowedhost가 발생하여 웹사이트가 정상적으로 작동하지 않습니다.
settings.py
base.py에 있는 BASE_DIR은 프로젝트의 root 경로를 저장해두는 변수
입니다.
이 변수를 통해 파일의 경로를 지정하는데, 우리는 기존의 settings.py를 안쪽으로 한번 쪼갰으므로 기존의 변수에서 os.path.dirname()을 한번 더 추가하여 root 경로를 한단계 더 안쪽으로 설정해줍니다.
각각 나눠진 파일들을 아래의 명령어를 통해 따로따로 적용하여
runserver 할 수 있습니다.
python3 manage.py shell --settings = 프로젝트 폴더.settings.사용할 파일명
python3 manage.py runserver --settings = 프로젝트 폴더.settings.사용할 파일명
이외에도 shell을 통해서 환경변수를 지정해주는 방식도 있습니다.
하지만 두 방법 다 매번 runserver마다 작성해야하므로 쓰기 번거롭습니다.
이때 가상환경 내
에 DJANGO_SETTINGS_MODULE 환경변수를
등록해두면 --settings 없이도 사용할 수 있게 됩니다.
shell을 통해 .env 위치로 들어간 뒤, 가상환경을 활성화 하고
다음 내용을 작성하여 환경변수를 등록해줍니다.
DJANGO_SETTINGS_MODULE = 프로젝트 폴더.settings.사용할 파일명
settings.py를 개발용과 배포용으로 나눈김에 requirements.txt도 공통,개발용,배포용으로 나누면 패키지설치에 필요한 시간과 메모리를 줄일 수 있습니다.
두 환경 다 공통적으로 설치해야하는 것
은 base.txt에
개발할때만 필요한 패키지
는 development.txt에
배포할때 필요한 패키지
는 production.txt에 넣어서 따로따로 설정합니다.
참고링크
https://cjh5414.github.io/django-settings-separate/
https://wikidocs.net/6606#_5
https://ehfgk78.github.io/2018/02/02/Django-Settings_Requirements/#heading-5-requirementstxt-%EB%B6%84%EB%A6%AC