Django 28강 Decorator를 이용한 코드 간소화

짜부·2023년 2월 2일

작정하고 장고

목록 보기
35/41

Decorator 개념

파이썬에서 제공하는 기능인 Decorator : 함수의 앞뒤에 붙여서 함수를 꾸며준다.

실제 코드에 적용


여기서 get과 post내용이 반복됨. 데코레이터를 이용해서 간소화할 예정

hello_world 데코레이터로 수정해보기

return HttpResponseRedirect(reverse('accountapp:login'))

삭제

@login_required 붙여주기(장고에서 미리 제공)

@login_required
def hello_world(request):
	~~~

Update, delete view수정

  1. 본인인증 부분 삭제

  2. @method_decorator()
    class안에 있는 함수이므로 위처럼 그래도 한다고 작동하지 않음.
    일반 function에서 사용하는 데코레이터를 method에 사용하게 해줌.
    첫번째 인자 : login_required 를 타고 우리가 적용할 method('get')을 적어줌

  3. 자격인증 부분 만들기
    accountapp-> decorators.py 생성

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
  1. 작성한 decorator를 적용

    이러면 원래랑 똑같음
    추가로,배열로 decorator를 넣어주면 데코레이터 길이를 줄일 수 있음.
    views.py 상단
has_ownership=[account_ownership_required, login_required()]

method_decorator 수정

@method_decorator(has_ownership,'get')
@method_decorator(has_ownership,'post')
profile
화이팅

0개의 댓글