• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[two scoop of django] 9장 함수기반뷰의모범적인이용

18 Aug 2018

Reading time ~2 minutes

9장 함수기반뷰의모범적인이용

1.들어가며

처음에는 함수뷰로 먼저 장고를 배우고 요즘에는 class뷰로 옮기고 있긴 하지만, 확실히 함수뷰를 전혀 안쓰는 것 보다는 적당히 섞어 쓰는 것이 확실히 좋다.

2. 내용

9.1 함수 기반 뷰의 장점

· 뷰 코드는 작을수록 좋다. 뷰에서 절대 코드를 반복해서 사용하지 말자. · 뷰는 프레젠테이션(presentation) 로직을 처리해야 한다. 비즈니스 로직은 가능한 한 모델 로직에 적용시키고 만약 해야 한다면 폼 안에 내재시켜야 한다. ·뷰를 가능한 한 단순하게 유지하자. · 403, 404, 500을 처리하는 커스텀 코드를 쓰는 데 이용하라. · 복잡하게 중첩된 if 블록 구문을 피하자.

9.2 HttpRequest 객체 전달하기

뷰에서 코드 재사용하기를 원하는 경우가 생긴다. 하지만 미들웨어나 콘텍스트 프로세서 같은 글로벌 액션에 연동되 있지 않아 재사용에 문제 => 해결책 프로젝트 전체를 아우르는 유틸리티 함수를 만드는 것을 추천

Tip1) HttpRequest 를 이용해라

매개변수화 시켜서 사용하는 것이 더 좋다 객체에 여러 추가적인 속성을 덧붙일 수 있다.

# sprinkles/views.py
from django.views.generic import DetailView
from .utils import check_sprinkles
 from .models import Sprinkle

class SprinkleDetail(DetailView):
     """표준 상세 뷰"""
    model = Sprinkle
    def dispatch(self, request, *args, **kwargs):
         request = check_sprinkles(request)
        return super(SprinkleDetail, self).dispatch(
                                            request, *args, **kwargs)

이렇게 클래스 안에 함수를 넣는법

9.3 편리한 데코레이터

그런데 이 건 데코레이터로 할 수도 있다.

# sprinkles/decorators.py
from functools import wraps
from . import utils

# 예제 8.5의 데코레이터 템플릿에 기반을 두고
def check_sprinkles(view_func):
    """사용자가 스프링클(별사탕)을 추가할 수 있는지 확인한다."""
    @wraps(view_func)
    def new_view_func(request, *args, **kwargs):
    # request 객체를 utils.can_sprinkle()에 넣는다.
        request = utils.can_sprinkle(request)
        # 뷰 함수를 호출
        response = view_func(request, *args, **kwargs)
        # HttpResponse 객체를 반환
        return response return new_view_func

이를 함수에 추가한다.

# views.py
from django.shortcuts import get_object_or_404, render
from .decorators import check_sprinkles
from .models import Sprinkle
# 뷰에 데코레이터를 추가
@check_sprinkles
def sprinkle_detail(request, pk):
    """표준 상세 페이지"""
    sprinkle = get_object_or_404(Sprinkle, pk=pk)
    return render(request, "sprinkles/sprinkle_detail.html", {"sprinkle": sprinkle})

9.3.1 데코레이터 남용하지 않기

적당히… 뭐든 적당히가 좋다 어쩌다 보면… 함수에 엄청나게 많은 데코레이터를 만들 때가 있다. 그럴 때는 함수뷰가 아닌 클래스 뷰를 사용하는 것이 더 좋은 것 같다.

9.4 HttpResponse 객체 넘겨주기

HttpRequest 객체에서 그랬듯이, HttpResponse 객체 또한 함수와 함수 사이에서 서로 전달받을 수 있다. Middleware.process_request() 메서드를 떠올리면 될 것이다

3.요약

http request받아서 넘겨주기가 핵심



Djangotwo_scoop_of_djangopython Share Tweet +1