뷰 장식자(View Decorators)

guava·2021년 12월 9일
0

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.

장식자

어떤 함수를 감싸는 함수이다.

예를 들어, login_required라는 로그인 여부를 확인하는 장식자를 적용하면, 로그인 한 유저만 해당 뷰 응답을 받을 수 있다.

@login_required  # 인증 유저에게만 뷰 응답을 하기 위한 장식자(decorator) 함수
def post_list(request):
    qs = Post.objects.all()
    return render(request, 'instagram/post_list.html', {
        'post_list': qs,
        'q': q
    })

CBV에 장식자 입히기

모든 뷰는 어떤 요청에도 dispatch 메서드를 통해 처리된다. 따라서 dispatch 메서드에 장식자를 적용하면 된다. 방법1 보다는 방법2가 더 깔끔해보인다.

방법1

dispatch를 재정의해서 직접 method_decorator 장식자를 통해 login_required 장식자를 적용

# 비추천 방법
@method_decorator(login_required, name='dispatch')
class PostListView(ListView):
    model = Post
    paginate_by = 10
    
    # 클래스 멤버함수에는 method_decorator를 활용해야 한다.
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
    

post_list = PostListView.as_view()

방법2

클래스에 method_decorator장식자를 통해 우리가 원하는 장식자를 적용할 수 있다. 파라미터로 원하는 장식자 함수(login_required)와 적용할 메서드 이름(dispatch)을 넘기면 된다.

# 추천하는 방법
@method_decorator(login_required, name='dispatch')
class PostListView(ListView):
    model = Post
    paginate_by = 10

post_list = PostListView.as_view()

번외

login_required 장식자 함수를 적용하는 방법을 소개하였다.

이 함수는 따로 Mixin을 장고에서 지원하기 때문에 장식자 문법이 아니라 상속을 통해 구현이 가능하다.

아래와 같이 LoginRequiredMixin 클래스를 상속받는다.

class PostListView(LoginRequiredMixin, ListView):
    model = Post
    paginate_by = 10

post_list = PostListView.as_view()

0개의 댓글