Django app 자동 추가 전략

최준영·2022년 4월 20일
0

django

목록 보기
3/3

django app 자동 추가

Django로 개발을 진행하다보면 자연스럽게 생성한 app을 settings.py 하위에 INSTALLED_APPS 안에 등록하게 됩니다.

등록되는 앱의 수가 적다면 하나씩 등록해도 되지만 앱 개수가 많아진다면 어떤 앱이 등록되었는지 어떤 앱이 등록되지 않았는지 정리가 힘들게 됩니다.

이 문제를 해결하기 위해 프로젝트에 등록되는 앱들을 하나의 폴더에 넣고 해당 폴더 안의 모든 앱들을 자동으로 INSTALLED_APPS에 등록되도록 합니다.

프로젝트 생성 및 구조

Django-admin startproject auto_app_test

기본적으로 프로젝트 명으로 메인 폴더가 생성되고 하위에 settings.py가 존재합니다.

기본 app 생성 및 추가

cd auto_app_test
python manage.py startapp test1

manage.py를 이용하여 새로운 app을 생성하면 settings.py에 생성된 app 폴더의 apps.py 클래스의 name값을 등록해야 한다.

기본 설정 서버 실행 확인

python manage.py runserver
서버를 실행시켜 에러가 나지 않고 정상적으로 실행되는 것을 체크한다.

자동 app추가를 위해 폴더 구조 변경

mkdir app

app폴더 이동 및 실행 테스트

‘app’ 폴더를 생성한 후 앞서 생성했던 test1 폴더를 app폴더 하위로 이동시킨다.
이대로 서버를 실행하면 ‘ModuleNotFoundError: No module named 'test1'‘ 에러가 발생한다.

이것을 해결하기 위해선 2가지를 ‘app.test1’로 수정해야 한다.
1. app/test1/apps.py 클래스 name값
2. 2. settings.py INSTALLED_APPS

기본 설정 서버 실행 확인

python manage.py runserver

정상적으로 실행된다.

앱 자동추가 로직 생성

settings.py

Python은 인터프리터 언어이기 때문에 위에서 아래로 순차적으로 해석한다. 즉, settings.py의 INSTALLED_APPS 배열 상단에서 자동화 로직을 추가 가능하다.


# settings.py
# api/하위폴더에 apps.py를 소유한 폴더라면 app으로 인식하고 등록합니다.
def get_app_list():
    app_list = []
    app_dir = os.path.join(BASE_DIR, 'app')
    for file in os.listdir(app_dir):
        file_path = os.path.join(app_dir, file)
        if os.path.isdir(file_path):
            if os.path.exists(os.path.join(file_path, 'apps.py')):
                app_list.append(file)

    app_list = list(map(lambda x: f"app.{x}", app_list))
    return app_list


INSTALLED_APPS = [
                     'django.contrib.admin',
                     'django.contrib.auth',
                     'django.contrib.contenttypes',
                     'django.contrib.sessions',
                     'django.contrib.messages',
                     'django.contrib.staticfiles',
                 ] + get_app_list()

자동 앱 추가 실행 확인

python manage.py runserver

정상적으로 실행된다.

0개의 댓글