Section 1. Decorator
1. Decorator
함수의 내부를 수정하지 않고 기능의 변화 또는 추가를 구현할 때 사용하는 기법으로 일반적으로 함수의 전처리나 후처리에 대한 필요가 있을때 사용한다.
2. Decorator 필요 상황
- 함수의 시작과 끝을 알리도록 print 문을 출력하고자 할 때 아래 코드로 수행할 수 있다. 하지만 함수가 많다면 각 함수마다 매번 print 문을 앞 뒤로 삽입해야 되는 번거로움과 print 문이 아닌 다른 코드를 수행하려고 수정할 때 모든 함수를 바꿔야하는 상황이 발생한다.
def hello():
print('hello 함수 시작')
print('hello')
print('hello 함수 끝')
3. Decorator 적용 코드
def decorator(func): # 함수 자체를 매개변수로 받음
def wrapper():
print(func.__name__, '함수 시작') # 전처리
func() # 원래 함수 수행
print(func.__name__, '함수 끝') # 후처리
return wrapper
@decorator # @데코레이터
def hello():
print('hello')
4. Decorator 주의사항
- hello() 함수의 매개변수가 없으면 wrapper() 또한 없음
- hello(a,b,c) 함수의 매개변수가 존재하면 wrapper(a,b,c) 또한 동일한 매개변수를 갖어야함
Section 2. 페이지 권한 설정
1. 페이지 권한
- 방문자 권한 - 로그인 하지 않아도 접근할 수 있는 페이지들에 대한 권한
- 로그인 - 로그인을 해야만 접근할 수 있는 페이지들에 대한 권한
- 관리자 권한 - 관리자만이 접근할 수 있는 페이지들에 대한 권한
2. User Model 수정
- user 의 권한 level 을 추가
- choices 는 속성의 도메인을 값을 선택할 수 있도록 지정
- migration 시 default 값은 'user' 로 지정
3. Admin 페이지에서 권한 수정
4. Decorator 생성
- user app 안에 decorators.py 생성
- login_required - 로그인 상태인지 확인하는 전처리 데코레이터
- admin_required - 관리자 권한인지 확인하는 전처리 데코레이터
5. Decorator 지정
- 데코레이터를 클래스 내부에 있는 특정 함수로 바로 지정할 수 있도록 method_decorator 사용
(from django.utils.decorators import method_decorator)
- Class-based View 는 dispatch() 함수로 시작하기 때문에 해당 함수를 name 에 지정
6. Decorator 분류
- login_required - 주문 목록, 주문하기
- admin_required - 상품 등록