Framework/Django

DRF manage.py 해석

JM Lee 2023. 10. 31. 17:52
728x90

개인 프로젝트를 진행하면서 DRF를 하나하나 이해해보기 위해 여러 가지를 보고 있는데,

모든 명령 코드가 manage.py에서 시작되기 때문에 manage.py 코드를 꼼꼼히 읽어보았다.

 

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


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Studysyncer.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()

manage.py의 전체 코드이다.

줄이 생각보다 적다고 생각할 수 있지만.. 까고 보면 상당히 많은 이해가 필요하다.

def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Studysyncer.settings')
    """
    Studysyncer.settings를 프로젝트의 설정 모듈로 사용하도록 환경 변수를 설정
    정상적일 경우 execute_from_command_line 함수를 실행
    """
    try:
        from django.core.management import execute_from_command_line 
    
    """
    except
    함수를 가져오는 동안 에러 발생 시 ImportError를 처리 
    Django가 설치되어 있지 않거나 PYTHONPATH 환경 변수에서 사용 가능한 위치에 Django가 없는 경우
    해당 예외가 발생
    """
    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
        
    # 명령줄 인수(sys.argv)를 전달하여 execute_from_command_line 함수를 실행
    # 이를 통해 manage.py를 사용하여 다양한 Django 관리 작업을 실행할 수 있습니다.
    execute_from_command_line(sys.argv)

 

좀 더 확실한 이해를 위해 내장함수로 저장된 것들을 알아보았다.

 

def execute_from_command_line(argv=None):
    """Run a ManagementUtility."""
    utility = ManagementUtility(argv)
    utility.execute()
    
"""
utility라는 인자를 만들었는데,
인자 하나가 붙는 ManagementUtility를 간단하게 설정했다.
여기서 이제 이 utility를 실행하면서 다음 단계로 넘어간다.
"""

 

이 다음에 그럼 ManagementUtility에서는 어떤 동작이 이루어지는지 알아보려고 했는데..

코드가 400줄이 넘어가서 읽기가 정말 쉽지 않았다.

먼저 챗지피티에 문의를 했는데

 

Django의 ManagementUtility 클래스는 Django 프로젝트와 관련된 여러 관리 작업을 수행하는 데 사용되는 클래스입니다. 이 클래스는 Django의 커맨드 라인 도구 (예: manage.py)를 통해 Django 프로젝트의 다양한 관리 명령을 실행하는 데 사용됩니다. 예를 들어, 데이터베이스 마이그레이션, 애플리케이션 생성, 서버 시작 등의 작업을 수행할 수 있습니다.

 

상당히 추상적이다..

그래서 너무 깊게 파지 않는 대신에 함수 별로 간단히 공부해보았다.

 


  1. main_help_text
    1. Django 관리 명령의 도움말 텍스트를 생성하고 반환하는 함수
    2. --help 옵션을 사용하거나 잘못된 명령을 입력했을 때 표시되는 명령어의 사용법과 설명을 생성하는 데 활용
  2. fetch_command
    1. 이 함수는 명령줄에서 입력한 명령에 해당하는 Django 명령 객체를 가져옴
    2. 객체를 인스턴스화해서 반환하는 함수
  3. autocomplete
    1. 검색 자동완성
    2. 보통은 JavaScript와 함께 사용되는 라이브러리 or 패키지 활용
    3. 이 기능을 디버깅해야 하는 경우, 디버그를 쓰는 편이 좋다
  4. execute
    1. manage.py 실행 시 명령줄에서 실행한 Django 관리 명령 처리