django view(8) : 뷰 장식자(decorator)

2022. 4. 16. 22:45
  • 인프런의 이진석 강사님의 장고강의를 참고

몇 가지 장고의 기본 decorator

  • django.views.decorators.http
    • require_http_methods : 인자로 get, post등의 메서드를 받는다. 지정된 메서드가 아니면 405 에러를 반환
    • require_get, require_post : get 혹은 post메서드만 허용
    • require_safe : 리소스의 변화를 일으키지 않는 안전한 메서드(Get, Head..)등만 허용
  • django.views.decorators.http
    • login_required : 로그아웃 상황에서 해당 데코레이터가 적용된 뷰가 호출되려하면 바로 login_url로 redirect됨
      • 참고 : login_url은 settings에서 설정가능하며, default 설정은 '/accounts/login'임
    • user_passes_test : (조건이 부가된 듯한)조금 더 섬세한 login_required.  함수를 지정해서 함수가 False를 반환하면 login_url로 redirect
    • permisiion_required : 지정된 퍼미션이 없을 때 login_url로 redirect
  • django.views.decorators.http
    • staff_member_required : user의 속성 중 하나인 staff_member가 없으면 403(forbidden) login_url로 이동

 

CBV에 장식자 입히기#1

  • CBV.as_view() >> 함수를 반환 >> CBV에도 데코레이터 적용가능
  • 다만 가독성이 좋지는 않다
  • 아래의 예시는 post_list를 보려면 로그인이 되어있어야 한다는 뜻임
from django.views.generic import ListView
from django.contrib.auth.decorators import login_required

post_list = ListView.as_view(model=Post,paginate_by=10)
logined_post_list = login_required(post_list)

 

CBV에 장식자 입히기#2

  • 바로 위의 방법외에도 CBV에 장식자를 적용시킬 수 있음. 아래의 두가지 방법의 실질 기능은 같다.
    1. CBV에서 항상 먼저 실행되는 멤버함수(ex:dispatch)를 재정의하면서 거기에 login_required 장식자같은 걸 적용 >> 해당 클래스뷰를 호출할 때 반드시 로그인이 필요하게 됨
    2. 재정의하는 클래스에도 method_decorator를 사용해서, 어떤 장식자를 어떤 멤버함수에 적용시킬지를 인자로 주면 장식자를 적용시킬 수 있음. 해당 장식자는 인자로 준 멤버함수에 적용됨
  • 아래의 예시는 두번째 방법임
#views.py
from django.views.generic import ListView
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

@method_decorator(login_required,name='dispatch')
class PostListView(ListView):
    model = Post
    paginate_by = 10

post_list = PostListView.as_view()

 

BELATED ARTICLES

more