Decorator : 패턴을 이용해서 자주 쓰이는 코드들을 줄일 수 있다.
1.
views.py 수정 [decorator를 이용한 수정]
has_ownership = [account_ownership_required, login_required]
@login_required
def hello_world(request):
# 로그인 인증이 되었을 경우, hello_world의 웹으로 요청
if request.method == "POST":
temp = request.POST.get('hello_world_input')
new_hello_world = HelloWorld()
new_hello_world.text = temp
new_hello_world.save()
return HttpResponseRedirect(reverse('accountapp:hello_world'))
else:
hello_world_list = HelloWorld.objects.all()
return render(request, 'accountapp/hello_world.html', context={'hello_world_list': hello_world_list})
class AccountCreateView(CreateView):
# User라는 장고에서 기본적으로 사용하는 model사용
model = User
# form 지정
form_class = UserCreationForm
# 연결 성공시 이동하는 페이지 지정
# reverse는 그대로 class에서 사용할 수 없기때문에, class형 view에서는 reverse_lazy
# reverse는 function형 view에서 사용
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'accountapp/create.html'
class AccountDetailView(DetailView):
model = User
context_object_name = 'target_user'
template_name = 'accountapp/detail.html'
@method_decorator(has_ownership, 'get')
@method_decorator(has_ownership, 'post')
class AccountUpdateView(UpdateView):
# User라는 장고에서 기본적으로 사용하는 model사용
model = User
# form 지정
context_object_name = 'target_user'
form_class = AccountUpdateForm
# 연결 성공시 이동하는 페이지 지정
# reverse는 그대로 class에서 사용할 수 없기때문에, class형 view에서는 reverse_lazy
# reverse는 function형 view에서 사용
success_url = reverse_lazy('accountapp:hello_world')
template_name = 'accountapp/update.html'
@method_decorator(has_ownership, 'get')
@method_decorator(has_ownership, 'post')
class AccountDeleteView(DeleteView):
model = User
context_object_name = 'target_user'
success_url = reverse_lazy('accountapp:login')
template_name = 'accountapp/delete.html'
Python
복사
** 반복되는 account_ownership_required, login_required를 리스트로 하여 더욱 줄일 수 있다.!
2.
./accountapp/decorator.py로 decorator 커스터 마이징
from django.contrib.auth.models import User
from django.http import HttpResponseForbidden
def account_ownership_required(func):
def decorated(request, *args, **kwargs):
user = User.objects.get(pk=kwargs['pk'])
if not user == request.user:
return HttpResponseForbidden()
return func(request, *args, **kwargs)
return decorated
Python
복사
** 오류 체크
path('login/', LoginView.as_view(template_name='accountapp/login.html'), name='login'),
path('logout/', LogoutView.as_view(), name='logout'),
Plain Text
복사
다음과 같이 url_pattern의 login, logout 부분 뒤에 /를 해주지 않아서 계속해서 login_required의 login_url로 요청되는 부분의 사이트를 찾을 수 없다는 오류가 발생하였다.