[Python Django] 4. Decorator 이용하기
              
          2022. 3. 26. 09:49ㆍPython/Django Framework
반응형
    
    
    
  
decorator 생성
# user/decotators.py
from django.shortcuts import redirect
def login_required(function):
    def wrap(request, *args, **kwargs):
        user_id = request.session.get('user_id')
        if user_id is None or not user_id:
            return redirect("/user/login/")
        return function(request, *args, **kwargs)
    return wrap
Function Base View (FBV)에 적용
# user/views.py
from user.decotators import login_required
@login_required # 함수명 위에 Decorator입력
def detail(request):
    user_id = request.session.get('user_id')
    user = User.objects.get(id=user_id)
    return render(request, 'detail.html', {'user': user})
Class Base View (CBV)에 적용
방식 1
# board/views.py
class BoardUpdateView(UpdateView):
    model = Board
    form_class = BoardUpdateForm
    template_name = "board_update.html"
	# Decotaor 추가
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
    def form_valid(self, form):
        user_id = self.request.session.get('user_id')
        if user_id:
            try:
                user = User.objects.get(pk=user_id)
            except User.DoesNotExist:
                return redirect("/user/login/")
        else:
            return redirect("/user/logout/")
        board = Board.objects.get(pk=self.kwargs.get("pk"))
        board.title = form.cleaned_data.get('title')
        board.contents = form.cleaned_data.get('contents')
        board.save()
        return super().form_valid(form)
    # pk를 이용하여 detail 페이지로 돌아갈 수 있게 success_url을 제어한다
    def get_success_url(self):
        pk = self.kwargs.get('pk')
        return f'/board/detail/{pk}'
방식 2
# board/views.py
@method_decorator(login_required, name='dispatch') # Decorator 추가
class BoardCreateView(FormView):
    form_class = BoardCreateForm
    template_name = "board_create.html"
    success_url = "/board/list/"
    def form_valid(self, form):
        # user 정보 취득
        user_id = self.request.session.get('user_id')
        if user_id:
            try:
                user = User.objects.get(pk=user_id)
            except User.DoesNotExist:
                return redirect("/user/login/")
        else:
            return redirect("/user/logout/")
        board = Board(
            title=form.cleaned_data.get('title'),
            contents=form.cleaned_data.get('contents'),
            insert_user=user
        )
        board.save()
        return super().form_valid(form)반응형
    
    
    
  'Python > Django Framework' 카테고리의 다른 글
| [Python Django] Template에서 파일명에 따라 ACTIVE 처리하기, resolver_match (0) | 2022.04.06 | 
|---|---|
| [Python Django] is_authenticated, is_anonymous, is_active (0) | 2022.04.01 | 
| [Python Django] 3-8. CBV DeleteView를 이용한 게시판 글 삭제 기능 구현 (0) | 2022.03.26 | 
| [Python Django] 3-7. CBV UpdateView를 이용한 글 수정 기능구현 (0) | 2022.03.26 | 
| [Python Django] 3-6. CBV ListView - Pagination 응용 get_elided_page_range() (0) | 2022.03.26 |