오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Web Programming/Django

[Django] python manage.py를 하면 무슨 일이?

junha6316 2021. 2. 26. 09:51

가장 많이 사용하는 Django 명령어 순위를 뽑아보면 당연히 아래의 명령어들이 상위에 있을 것이다.

python manage.py makemigrations
python manage.py migrate
python manage.py runserver
python manage.py startapps
python manage.py createsuperuser
 

하지만 장고를 사용하는 4개월 동안 단 한번도 이 manage.py가 무슨 일을 하는지 생각해본적이 없다..

하지만 문득 얘는 뭘하는 애지 라는 생각이 들었고. python manage.py something 을 작성했을 때 무슨 일이 일어나는지 관련된 명령어들에 대한 분석을 해보려고 했다.

 

이번 글은 그런 글들 중 첫번째 글로 python manage.py을 작성했을 때 무슨 일이 일어나는지 작성해보려고 한다.

 

먼저 python manage.pymanage.py를 실행시키는 건 모두들 알 것이다. 그렇다면 manage.py로 들어가보자

 

manage.py 코드는 다음과 같다.

import os
import sys


def main():
    """Run administrative tasks."""
    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)

if __name__ == '__main__':
    main()

 

1. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

 

 먼저 첫번째 코드는 환경변수에 'DJANGO_SETTINGS_MODULE'라는 이름으로 config.local.settings라는 문자열을 등록시켜주는 명령어 이다. 아마 settings.py가 프로젝트 전역에서 사용되기 때문에 이런식으로 환경변수로 넣어 준 것 같고 이를 확인해보기 위해선 아래처럼 작성해주면된다.

python manage.py shell
>> import os
>> os.environ

 

2. execute_from_command_line(sys.argv)

두번째 코드는 다음과 같다.

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)

다음 코드는 django.core.management 로 부터 execute_from_command_line 이라는 함수를 가져오는 코드import에 실패하면 장고가 제대로 다운로드 되지 않을 것이므로 ImpotError 에러 메세지를 전달하고 아니라면 execute_from_command_line(sys.argv)를 실행 시켜준다.

여기서 sys.argv는 command line(terminal)에서 파이썬 스크립트를 실행시킬 때 python 뒤에 오는 모든 문자열이다. 이를 확인해보기 위해선 현재 디렉토리에 다음과 같이 test.py를 작성해서 저장해주자.

#test.py
import sys

if __name__=='__main__':
    print(sys.argv)

저장 후에 아래와 같이 터미널에서 작성해주면 다음과 같이 출력된다.

python test.py something

 

['test.py', 'something']

 

정리해보면 manage.py는 settings,py의 위치를 환경변수로 등록시켜주고 뒤에 오는 arguments들을 이용 execute_from_command_line을 실행 시켜주는 것을 알 수 있다. 다음 글에서는 argument에 따른 execute from_command_line이 어떤 식으로 동작하는지 알아보도록 하자. 먼저 제일 자주 사용하는 runserver편이다.

https://cocook.tistory.com/126

 

[Django] python manage.py를 하면 무슨 일이?(runserver 편)

지난 글에서는 python manage.py를 작성했을 때 어떤 과정으로 명령어가 실행되는지 알아보았다. 이번 포스트에서는 python manage.py 명령어 중에 가장 많이 사용한다고 해도 무방한 python manange.py runserve

cocook.tistory.com