All Articles

manage.py 실행환경 쉽게 설정하기

앞글에서 django로 개발할 환경들(product.py, develop.py, local.py )을 세팅해 놨는데, 실행을 위해선 manage.py를 변경해 주어야 한다.

#beautiful_awosome_project/manage.py 

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'beautiful_awosome_project.settings.local')
    #settings 밑에 하위 파일들을 만들어 놓았기 때문에, 
    #실행을 원하는 세팅을 명시해놔야한다. 여기서는 local로 설정
    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)

if __name__ == '__main__':
    main()

이렇게 설정을 해놓으면

$python manage.py <command>

실행시 local.py setting 값으로 command가 실행된다.

이렇게 쓰려고 하면 환경을 바꿔서 실행할 경우마다 manage.py를 변경하고 실행해야하므로 번거로워 진다.

그래서 manage.py를 살짝 손봐 세팅환경 변경을 쉽게 해보도록 하겠다.

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    if 'production' in sys.argv:
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings.production')
        sys.argv.remove('production')
    elif 'develop' in sys.argv:
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings.develop')
        sys.argv.remove('develop')
    else:
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings.local')
    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)


if __name__ == '__main__':
    main()

sys.argv 는 $python으로 실행시 입력된 값들을 담은 커맨드 실행 명령 인자 list 이다. argv[0]은 실행 파일(manage.py)이 된다.

원래 있던 파일에 제가 설정한 키워드가 들어가면 그 키워드에 맞추어 실행환경을 세팅합니다. 아무 키워드도 입력하지 않으면 local을 기본 환경으로 동작합니다. 키워드가 남아있으면 manage.py 동작에 방해가 될것 같아 환경을 지정하고 다시 sys.argv에서 삭제를 합니다.

이렇게 해놓으면 아래처럼 변수 하나로 python 실행 환경을 자유롭게 이동 할 수 있습니다.

$python manage.py	develop runserver
#develop 환경으로 runserver

$python manage.py	product migrate
#product 환경으로 migrate

$python manage.py shell
#develop 환경으로 shell 접속

주의사항

  1. 인자를 확인하고 다시 제거 하기 때문에 환경키워드를 아무 위치에나 두어도 동작은 합니다. django 명령어의 순서는 바꾸면 안됩니다.
  2. 환경 키워드를 장고 명령어와 동일한 것으로 사용시 꼬여서 에러가 발생할 수 있으니 겹치지 않는 키워드를 사용해 주세요.