(위와 같이 여러개의 함수(메소드)가 있는데,
이 함수마다 시작시간, 끝나는 시간을 알고 싶으면 아래와 같이 함수의 시작시간 끝나는 시간을 출력하도록 구현)
(위와 같이 코딩 시 중복되는 반복 작업이 많아지게 된다.
핵심이 아닌 코드 들이 가독성을 해친다. (위에서의 datetime.now()들 )
따라서 아래와 같이 Decorator를 사용하는 것이다. 그 구성을 아래에서 보여준다.)
(어떤 함수(func)을 받아서, 그 함수를 앞뒤로 위와 같이 꾸며 줄 수도 있고,
이는 함수의 내부를 고치지는 않지만 함수의 앞 또는 뒤를 붙여서 꾸며준다.)
(@decorator를 함수 앞에 붙여서 왼쪽과 오른쪽이 같은 효과를 가지게 된다.)
(decorator를 적용하지 않은 hello_world 함수)
(장고에서 기본 제공해주는 @login_required를 이용하여 위아래 있던 if,else 문을 지우고 함수를 간략화한 모습을 위 코드에서 볼 수 있다.
물론 import는 필요하다.)
(로그인 하지 않고 accounts/hello_world에 접속한 모습 전과 같은 기능을 함)
=> 위와 같이 무조건 @login_required를 한다고 작동하지는 않는다.
(데코레이터 사용 전 AccountUpdateView의 모습)
=> @method_decorator()를 사용한다.
이는 일반 fucntion(함수)에서 사용하는 decorator를 메소드에서 사용할 수 있도록 변환해주는 decorator 이다.
(위와 같이 login_required 데코레이터를 뒤에 지정해준 이름의 메소드에서도 사용 할 수 있도록 해주는 기능을 한다.
여기서 자기가 주인인지 판별하는 과정이 빠지기는 한다.
AccountDeleteView에도 동일하게 적용해 주었다.)
=> 자기가 주인인지 판별하는 과정을 구현하기 위해서 우리가 custom을 해줄 필요가 있다. (custom decorator를 만들 것임)
1)decorators.py를 아래와 같이 accountapp 하위에 만든다.
2) decorator 생성
(decorator의 이름을 위와 같이 자신이 설정도 가능하다.)
3) 각 뷰에 우리가 만든 decorator를 적용시키기
(이런 식으로 하면 원래 있던 코드와 동일하게 되는 것이다.)
4) 더 정리해보기 (method_decorator의 좋은 점)
(view.py 상단에 위와 같이 배열을 생성하고 배열 내부에 각 decorator를 넣어 준다.)
(위와 같이 method_decorator 의 인자로 아까의 배열을 주면
이 배열 내에 있는 decorator들을 모두 확인하고 체크해준다.
=> 코드의 간략화)
=> test
(비정상 접근 탐지, 로그인 상태이거나, 로그아웃 상태에서도 동일하게 거부)
(자기 자신의 페이지는 주소창으로 들어가도 정상적으로 들어간다.)