택시짱의 개발 노트

29장 - 유틸리티들에 대해 본문

Django(장고)

29장 - 유틸리티들에 대해

택시짱 2022. 1. 26. 22:25

29.1 유틸리티들을 위한 코어 앱 만들기

조금이라도 연관이 있는 앱 하나를 찾아 그곳에 무작위로 유틸리티들을 무작위로 넣었다가는 훗날 유틸리티가 필요할때 찾기 어려운 상황에 봉착할 수 있다.

프로젝트 전반에 걸쳐 쓰이는 함수들과 객체들을 넣어 두는 코어(core)라는 장고 앱을 이용하여 유틸리티들을 보관한다.

  • 예를들어 여러 앱에서 공통으로 이용하는 커스텀 모델 매니저와 custom view mixin 등등
core/
  __init__.py # 커스텀 모델 매니저 포함
  models.py
  views.py # 커스텀 뷰 믹스인 포함

- 이때 코어 앱의 구조는 일반 장고 앱의 구성을 따르는게 좋다.
  • 코어 앱 안에 위치한 커스텀 모델 매니저나 뷰의 믹스인을 임포는하는 것은 다른 일반 장고앱을 임포트하는 방법과 같다.
from core.managers import PublishedManager
from core.views import IceCreamMxin

29.2 유틸리티 모듈들을 이용하여 앱을 최적화하기

29.2.1 여러 곳에서 공통으로 쓰이는 코드를 저장ㅇ해 두기

여러 곳에서 공통으로 쓰이는 하뭇와 클래스지만 models.py, forms.py 또는 다른 특별한 이름의 모듈에 이를 넣기보다는 utils.py 모듈에 위치시키자

29.2.2 모델을 좀 더 간결하게 만들기

Flavor 모델을 빈번히 이용하는 상황에서 Flavor모델안에 메서드 또는 클래스 메서드들을 연이어 붙여 코드를 작성하다보면 모델이 너무나 비대해지는것을 볼 수 있다.

property 또는 classmethod를 포함한 여러 메서드에서 flavors/utils.py 안으로 쉽게 캡슐화해 넣을 수 있는 부분을 찾아보자.

이렇게 함으로써 코드를 좀 더 분산 시킬 수 있고, 재사용과 테스팅이 한결 수월해 질 수 있다.

29.2.3 좀 더 손쉬운 테스팅

복잡하게 얽힌 로직들로부터 함수를 떼어 내고 독립적인 모듈로 이전하면 좀 더 쉬운 테스팅이 가능해진다.

여기서 독립적이란 의미는 하나의 앱 안에서 독자적으로 임포트되는 것만으로도 기능을 충분히 발휘할 수 있다는것이다. (A앱안에 있는 기능을 실행시키기 위해서 B에서 함수를 가지고 오면 안됨)

29.3 장고 자체에 내장된 스위스 군용 칼

  • 스위스 군용 칼 이란?

    작지만 매우 유용한 다목적 도구

장고는 다수의 유용한 헬퍼 함수를 django.utils 패키지에 내장하고 있다.

django.utils 모듈들은 대부분 장고 내부적인 이용을 목적으로 제작되었고 장고 버전이 바뀜에 따라 그 용도와 내용도 바뀐다.

29.3.1 django.contrib.humanize

사용자들에게 좀 더 ‘인간’ 친화적인 기능들을 제공하는 템플릿 필터

29.3.2 django.utils.decorators.method_docorator(decorator)

@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
    return super().dispatch(request, *args, **kwargs)

29.3.3 django.utils.decorators.decorator_from_middleware(middleware)

29.3.4 django.utils.encoding.force_text(value)

29.3.5 django.utils.functional.cached_property

self 인자만을 단독으로 가진 메서드의 결과를 프로퍼티로 메모리에 캐시해 주는 기능

프로젝트의 성능 최적화라는 관섬에서 매우 유용한 기능이며 우리의 모든 프로젝트에서 리소를 많이 요구하는 연산의 결과를 캐시하는 역활로 빈번히 이용

cache_property를 이용하면 해당 객체가 존재하는 동안 메서드의 값이 항상 일정한지 확인하는 용도로 쓴다.

이는 외부 서드 파티 API 또는 데이터베이스 트랜잭션 관련 작업을 할 때 매우 유용하게 쓰인다.

29.3.9 django.utils.six

python2와 python3의 차이를 부드럽게 녹여주는 라이브러리

29.3.10 django.utils.text.slugify(value)

?????

29.3.11 django.utils.timezone

장고에서 지원하는 시간대 기능

29.3.12 django.utils.translation

국제화(i18n) 기능 제공

29.4 예외

29.4.1 django.core.exceptions.ImproperlyConfigured

장고를 이용할 때 설정상의 문제를 알려준다

29.4.2. django.core.exceptions.ObjectDoesNotExist

모든 DoesNotExist 예외가 상속하는 기본 Exception 모듈이다.

29.4.3 django.core.exceptions.PermissionDenied

인증된 사용자가 허가되지 않는 곳에 접속을 시도할 때 이용 (status_code = 403)

if not user.is_authenticated:
    raise PermissionDenied

29.5 직렬화 도구와 역직렬화 도구

단순한 REST API를 제작할 때 사용

# serializer_example.py
from django.core.serializer import get_serializer

from favorites.modesl import Favorite

# serializer 클래스 생성
# 'json'을 'python'이나 'xml'로 바꾸어 이용해도 된다.
# pyyam이 설치되어 있을 경우 'pyyaml'을 'json' 대신 써도 된다.
JSONSerializer = get_serializer("json")
serializer = JSONSerializer()

favs = Favorite.objects.filter()[:5]

# 모델 데이터의 직렬화
serialized_data = serializer.serialize(favs)

# 다음 예제를 위해 직렬화된 데이터를 저장하기
with open("data.json", "w") as f:
    f.write(serialized_data)
# deserializer_example.py
from django.core.serializers import get_serializer
from favorites.models import Favorite

favs = Favorite.objects.filter()[:5]

# serializer 클래스 생성
# 'json'을 'python'이나 'xml'로 바꾸어 이용해도 된다.
# pyyam이 설치되어 있을 경우 'pyyaml'을 'json' 대신 써도 된다.

JSONSerializer = get_serializer("json")
serializer = JSONSerializer()

# 직렬화된 데이터 파일 열기
with open('data.txt') as f:
    serialzied_data = f.read()

# 'python_date'로 역직렬화된 모델 데이터 넣기
python_data = serializer.deserialize(serialized_data)

# python_date 처리
for element in python_data:
    # 'django.core.serializer.base.DeserilizeObject' 출력
    print(element)

    # 엘리먼트들은 모델 인스턴스에서 생성된 객체들을 가지고 있게 된다.
    # 이 경우 favorites.models.Favorite가 element에 들어 있다.
    print(
        element.object.pk,
        element.object.created
    )

29.5.1 django.core.serializer.json.DjangoJSONEncoder

파이썬에 내장되어 있는 JSON 모듈 자체에는 날짜, 시간 소수점 데이터를 인코딩 하는 기능이 빠져 있다.

29.5.2 django.core.serializer.pyyaml

서드 파티 라이브러리인 pyyaml의 도움을 받는 장고의 YAML 직렬화 도구 시간 변환 처리를 가능하게 함

29.5.3 django.core.serializers.xml_serializer

요약

빈번하게 재사용되는 파일들을 유틸리티 패키지로 넣자

장고가 제공하는 유틸리티는 유용한게 많으니 잘 골라서 쓰자

반응형
Comments