파이썬/장고 웹서비스 개발 완벽 가이드 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
})
모든 뷰는 어떤 요청에도 dispatch 메서드를 통해 처리된다. 따라서 dispatch 메서드에 장식자를 적용하면 된다. 방법1 보다는 방법2가 더 깔끔해보인다.
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()
클래스에 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()