[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 |