Python/Django Framework

[Python Django] 4. Decorator 이용하기

Jake the Dog 2022. 3. 26. 09:49
반응형

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)
반응형