수학과의 좌충우돌 프로그래밍

[Django] FBV 와 CBV 의 decorators 사용법 본문

웹프로그래밍/Django

[Django] FBV 와 CBV 의 decorators 사용법

ssung.k 2019. 8. 8. 04:53

decorator 는 처음보는 생소할 수 있지만 python 기초 문법입니다. decorator 가 무엇인지 모르신다면 아래 링크를 통해 기초적인 부분을 먼저 공부하고 오시는걸 추천해드립니다.

python 장식자, decorator란?

 

[python] 장식자, 데코레이터(decorator) 를 알아보자

python 으로 작성된 다른 코드들을 보다보면 아래와 같이 어느 함수 위에 @ 가 있는 걸 볼 수 있습니다. 이 @ 는 무엇을 나타내고 어떤 역할을 하지는 알아보도록 합시다. @decorator def function1(): print("ssu..

ssungkang.tistory.com

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_decoratorname 값을 지정함으로서 클래스 메소드에 대해서 해당 decorator 를 사용할 수 있습니다. 원리적으로는 방법 2와 동일하나 가독성을 해칠 염려도 없습니다.

 

 

Comments