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
- login_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에 장식자를 적용시킬 수 있음. 아래의 두가지 방법의 실질 기능은 같다.
- CBV에서 항상 먼저 실행되는 멤버함수(ex:dispatch)를 재정의하면서 거기에 login_required 장식자같은 걸 적용 >> 해당 클래스뷰를 호출할 때 반드시 로그인이 필요하게 됨
- 재정의하는 클래스에도 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()
'django > basic' 카테고리의 다른 글
HttpRequest와 HttpResponse // django form(2) (0) | 2022.04.17 |
---|---|
HTML Form과 Django Form // django form(1) (0) | 2022.04.17 |
django view(7) : GenericDateViews (0) | 2022.04.16 |
django view(6) : generic display views (0) | 2022.04.16 |
django view(5) : view함수를 활용한 json기반의 api통신 (0) | 2022.04.16 |