웹프로그래밍/Django
[Django] FBV 와 CBV 의 decorators 사용법
ssung.k
2019. 8. 8. 04:53
decorator
는 처음보는 생소할 수 있지만 python 기초 문법입니다. decorator
가 무엇인지 모르신다면 아래 링크를 통해 기초적인 부분을 먼저 공부하고 오시는걸 추천해드립니다.
FBV 에 decorators 사용법
FBV
는 함수로 작성하기 때문에 기존에 알던 방법과 동일합니다. 아래 처럼 2가지 방법이 있습니다.
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
# 방법 1
@login_required
def post_create(request):
# 생략
return render(request, 'core/index.html')
# 방법 2
def post_create(request):
# 생략
return render(request, 'core/index.html')
post_create = login_required(post_create)
CBV 에 decorators 사용법
CBV
에선 클래스로 작성하기 때문에 일반적으로 위의 방법이 통하지 않습니다.
# 방법 1
from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView
class MyTemplateView(TemplateView):
template_name= "core/index.html"
index = MyTemplateView.as_view()
index = login_required(index)
첫 번째 방법으로는 as_view
를 이용해서 함수를 만든 다음 함수를 감싸주는 방법입니다.
# 방법 2
from django.utils.decorators import method_decorator
class MyTemplateView(TemplateView):
template_name= "core/index.html"
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
index = MyTemplateView.as_view()
두 번째 방법은 dispatch
함수를 사용하는 방법입니다. 이 함수는 클래스가 새로운 함수를 만들 때마다 항상 실행되는 함수이기 때문에 이 함수를 재정의하며 메소드 데코레이터를 추가해주는 방법입니다.
dispatch
에 새로운 내용을 추가해주는 것도 아닌데 재정의 함으로서 코드의 가독성을 떨어뜨립니다.
# 방법 3
@method_decorator(login_required, name="dispatch")
class MyTemplateView(TemplateView):
template_name= "core/index.html"
index = MyTemplateView.as_view()
가장 추천하는 방법입니다. @method_decorator
는 name
값을 지정함으로서 클래스 메소드에 대해서 해당 decorator
를 사용할 수 있습니다. 원리적으로는 방법 2와 동일하나 가독성을 해칠 염려도 없습니다.