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