Django 뷰 장식자(Decorators)

2022. 1. 10. 21:13강의 정리/Django Views

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(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와 모든 퍼미션이 허가가 된다. 

 

Permission

 

 

 


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/

 

View decorators | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

반응형