본 문서는 패스트캠퍼스 ‘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 디렉토리에는 `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'