Django-Deploy_EC2(Settings분할)

본 문서는 패스트캠퍼스 ‘Web-Programming School’ 수업 자료를 바탕으로 작성되었습니다.


settings 분할

개발 환경에 맞게 settings파일과 secrets 디렉토리를 설정해보자.

.
├── app
│   ├── config
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── settings.cpython-36.pyc
│   │   │   ├── urls.cpython-36.pyc
│   │   │   └── wsgi.cpython-36.pyc
│   │   ├── settings
│   │   │   ├── base.py
│   │   │   ├── dev.py
│   │   │   ├── __init__.py
│   │   │   ├── local.py
│   │   │   ├── production.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── db.sqlite3
│   ├── manage.py
│   └── static
│       └── cat.png
├── requirements.txt
└── .secrets
    ├── base.json
    ├── dev.json
    └── local.json

  • base : 프로젝트 전체에 사용되는 부분
  • local : 로컬에서 개발할 때만 사용되는 부분
  • dev : 서버에서 개발하는 동안에 사용되는 부분
  • production : 배포환경에 사용되는 부분

모듈 설정

  • manage.py가 실행되면 DJANGO_SETTINGS_MODULE에 기본적으로 config.settings로 설정된다. 그러나 settings 디렉토리를 생성함으로서 모듈이 여러개로 나눠줘야 한다.

  • export DJANGO_SETTINGS_MODULE = config.settings.local 을 터미널에서 실행한다. 이러면 manage.py가 실행될 때 위의 모듈로 실행된다. 현재 실행되는 모듈을 확인하고 싶다면, env로 현재 설정된 환경변수들을 확인 할 수 있다.

#  app/manage.py

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    # manage.py가 실행되면 config.settings가 실행된다.
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)

README 작성하기

wsgi 패키지화

wsai파일을 파이썬 모듈로 패키지화 한후, 아래와 같은 구조로 파일을 생성해주자.

.
├── config
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings
│   │   ├── base.py
│   │   ├── dev.py
│   │   ├── __init__.py
│   │   ├── local.py
│   │   ├── production.py
│   ├── urls.py
│   └── wsgi
│       ├── dev.py
│       ├── __init__.py
│       ├── local.py
│       ├── production.py

  • 각 모듈에 맞게 설정을 하고, app/config/wsgi/__init__.py에 있는 내용은 지우자. 만약 지우지 않는다면, 서버를 실행시켰을 때 기본 모듈로 동작되기 때문에 꼭 지워야한다.!!!(이걸로.. 얼마나 시간을 ㅜㅜ)
# app/config/wsgi/dev.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.dev")
application = get_wsgi_application()

# app/config/wsgi/local.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
application = get_wsgi_application()

# app/config/wsgi/production.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
application = get_wsgi_application()

application

WSGI로 배포하는 것중 가장 핵심은 애플리케이션 서버가 우리가 작성한 코드를 실행하는데 사용하는 애플리케이션 호출 가능 애플리케이션이다. 일반적으로 Python 모듈에서는 서버에 엑세스 할 수 있는 application이라는 객체를 제공한다.
장고의 경우, <project_name>/wsgi.py로 애플리케이션을 호출 할 수 있다. 즉 runserver 명령은 WSGI_APPLICATION 설정을 호출한다. 이때 이러한 설정은 <project_name>/wsgi.py에서 호출 가능한 .wsgi.application으로 설정되어있다.
위에 패키지화한 wsgi 디렉토리에는 `DJANGO_SETTINGS_MODULE`을 통해 각 환경에 맞는 모듈을 불러온다. 이때 애플리케이션도 함께 실행시키기 때문에 애플리케이션 설정에도 패키지한 것을 반영해야 한다. 그리고 각 모듈에서 `runserver`를 하면 서버가 제대로 실행되는 것을 볼 수 있따.

# app/config/settings/dev.py
WSGI_APPLICATION = 'config.wsgi.dev.application'
# app/config/settings/local.py
WSGI_APPLICATION = 'config.wsgi.local.application'
# app/config/settings/production.py
WSGI_APPLICATION = 'config.wsgi.production.application'