Back-End/Python Django

[Django] apps.py의 간단한 활용

Hoplin 2022. 3. 5. 00:37
반응형

apps.py?

django application을 생성하면 여러 파일들이 생기는데 그중 apps.py라는 파일이 있다. 이 파일은 프로젝트 디렉토리의 settings.py에 INSTALLED_APPS에 디폴트 app 클래스를 등록하여 프로젝트 애플리케이션을 등록해 사용하곤 한다. 

아래와 같이 말이다.

위 사진을 보면 Books.Config라는 클래스를 INSTALLED_APPS에 등록해주어 사용한다.

 

apps.py의 활용

그렇다면 단지 apps.py는 이러한 용도만 있을까? 이외 용도가 더 있다. 예를 들어 홈화면을 만드는 코드라고 가정하자. 홈화면에는 각 모델들의 index페이지로 들어가는 링크들이 있다고 가정하자.

 

# Project Directory's : views.py 

from django.views.generic.base import TemplateView
from django.apps import apps

class  HomeView(TemplateView):
    template_name = 'home.html'
    
    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        context['app_list'] = ['polls','books']
        return context
        
 
 # Project Directory's : index.html
 
{% extends "base_books.html" %}
{% block content %}
    <h2>Book Management System</h2>
    <ul>
    {% for appname in app_list %}
        {% with appname|add:":"|add:"index" as urlvar %}
            <li><a href="{% url urlvar %}">{{ appname }}</a></li>
        {% endwith %}
    {% endfor %}
    </ul>
{% endblock content %}

위 코드에서, Django Application의 리스트들인 polls, books 를 하드코딩하였다.

context['app_list'] = ['polls','books']

apps.py를 통해 이를 개선할 수 있다. 

# books / apps.py
from django.apps import AppConfig


class BooksConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'books'
    verbose_name = "Book-Author-Publisher App"
    
    
# polls / apps.py
from django.apps import AppConfig


class PollsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'polls'
    verbose_name = 'Vote app'

우선 각 애플리케이션의 apps.py에 verbose_name이라는 클래스 변수를 정의해준다. 이는 app의 이름을 의미하는 예시 변수이다. 그리고 views.py를 아래와 같이 바꿔보자.

from django.views.generic.base import TemplateView
from django.apps import apps

class HomeView(TemplateView):
    template_name = 'home.html'
    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        dictVerbose = {}
        for app in apps.get_app_configs():
            if 'site-packages' not in app.path:
                dictVerbose[app.label] = app.verbose_name
        context['verbose_dict'] = dictVerbose
        return context

위 코드를 해석해 보자. 우선 Class View중 TemplateView를 상속받았다. 그렇기 때문에 template_name 클래스 변수를 보여주고자 하는 template이름으로 재정의 하였고, context를 얻기 위해서 get_context_data메소드를 오버라이딩 한다.  get_context_data 는 무조건 super().get_context_data(**kwargs)를 해주어야 한다는것을 잊지말자. 

 

그 다음 dictVerbose 딕셔너리를 정의해준다. 이 딕셔너리는 위에서 지정한 앱들에 대해 (앱 이름) : (verbose) 형태로 저장하기 위한 딕셔너리이다. apps.get_app_configs() 메소드를 호출하게 되면 settings.py파일의 INSTALLED_APPS에 등록된 각 앱의 설정 클래스(apps.py)를 담은 리스트를 반환한다. 실제로 get_app_configs()메소드를 호출하면 아래와 같은 결과가 나오는것을 볼 수 있다. get_app_coinfigs 메소드가 궁금하면 아래 Document를 참조해보는것이 좋다.

https://docs.djangoproject.com/ko/4.0/ref/applications/#django.apps.apps.get_app_configs

 

Applications | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

그 다음 아래 조건문에서 'site-packages'가 없는 경우에 대해서만 dictVerbose에 딕셔너리를 등록하는것을 볼 수 있다. 물리적 경로에서 'site-packages' 문자열이 들어있으면 외부 라이브러리 앱이란 뜻이다. 여기에는 장고에서 기본적으로 제공하는 앱들도 포함이 된다.  각 앱별로 경로를 출력해보면 아래와 같이 나온다. 외부 애플리케이션들은 site-packages라는 부모 디렉토리 아래에 존재하는것을 볼 수 있다.(아래 앱들은 Django 내장 앱들이다)

딕셔너리에 키값으로 사용하는 app.label을 보자. app.label같은 경우에는 document에 클래스 변수중 'name' 변수와 동일한 의미를 가지는 필드라고 기재되어있다

https://docs.djangoproject.com/en/4.0/ref/applications/#django.apps.AppConfig.label

 

Applications | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

verbose_name은 아까 설정한 클래스변수의 값을 의미한다. 그 후 context변수에 dictVerbose를 등록해 준다. 이번에는 template을 변경해 주자. 

#home.html


{% extends 'base.html' %}

{% block content %}
    <h2>Djagno Application</h2>
    <ul>
        {% for key,value in verbose_dict.items %}
            <li><a href="{% url key|add:':'|add:'index' %}">{{ value }}</a></li>
    {% endfor %}
    </ul>
{% endblock content %}

 items는 딕셔너리에서 Key, Value를 Set타입으로 묶어 반환하는 메소드이다. 그리고 다시 실행해 보면 아래와 같이 아까 지정했던 Verbose_name값으로 출력되는것을 볼 수 있다.

 

반응형