Django 뷰 장식자(Decorators)
2022. 1. 10. 21:13ㆍ강의 정리/Django Views
반응형
장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!
뷰 장식자(Decorators)
- 어떤 함수를 감싸는 함수 @login_required는 로그인이 된 유저에게만 해당 함수 뷰가 보이게하는 장식자이다.
@login_required
def protected_view1(request):
return render(request, 'myapp/secret.html')
장고 기본 Decorators
- django.views.decorators.http
- require_http_methods(인자) # 인자로 지정한 메소드만 받는다.
- require_GET, require_POST, require_safe # 인자로 지정한 메소드만 GET, POST, safe(변화X, 조회만) 한다.
- 지정 method가 아닐경우, HTTPResponseNotAllowed 응답 (상태 코드 405) 반환
- django.contrib.auth.decorators
- user_passes_test : 지정 함수가 False를 반환하면 login_url로 redirect # 좀더 조건을 섬세하게 설정가능 ex) 유저가 프리미엄 유저인지 아닌지, 유저의 포인트가 몇점 이상인지
- login_required : 로그아웃 상황에서 login_url로 redirect
-
@login_required def post_list(request): qs = Post.objects.all() q = request.GET.get('q', '') if q: qs = qs.filter(message__icontains=q) return render(request, 'instagram/post_list.html', { 'post_list': qs, 'q' : q, })
-
- permission_required : 지정 퍼미션이 없을 때 login_url로 redirect
- django.contrib.admin.views.decorators
- staff_member_required : staff member가 아닐 경우 login_url로 이동
- staff 권한이 있으면 admin page에 접근 가능
- superuser 권한이 있으면 admin page와 모든 퍼미션이 허가가 된다.
- staff_member_required : staff member가 아닐 경우 login_url로 이동
CBV에 장식자 입히기 # 가독성이 좋지 않음
- 요청을 처리하는 함수를 Wrapping 하기
class SecretView(TemplateView):
template_name = 'myapp/secret.html'
view_fn = SecretView.as_view()
secret_view = login_required(view_fn) # 이미 생성된 함수에 장식자를 입힐 수 있다.
- 클래스 멤버 함수를 Wrapping 하기
class SecretView(TemplateView):
template_name = 'myapp/secret.html'
# 클래스 멤버함수에는 method_decorator를 활용
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs):
secret_view = SecretView.as_view()
- 클래스에 직접 Wrapping 하기
@method_decorator(login_required, name='dispatch') class SecretView(TemplateView): template_name = 'myapp/secret.html' secret_view = SecretView.as_view()
https://docs.djangoproject.com/ko/4.0/topics/http/decorators/
반응형
'강의 정리 > Django Views' 카테고리의 다른 글
적절한 HTTP 상태코드로 응답하기 (0) | 2022.01.11 |
---|---|
Django 기본 CBV API (Generic date views) (0) | 2022.01.11 |
Django 기본 CBV API (Generic display views) (0) | 2022.01.10 |
Django 기본 CBV API (Base views) (0) | 2022.01.09 |
Django 클래스 기반 View (0) | 2022.01.08 |