어느 사이트이건, 회원가입을 해서 로그인을 해야만 게시글을 올릴 수 있고, 댓글을 달 수 있고, 다른 사람 혹은 나 자신의 게시글에 좋아요를 누를 수 있을 것이다.
이것을 views.py에서 구현하려면 어떻게 해야할까? decorator 를 사용해야만 한다!
그렇다면 decorator는 무엇일까? Decorator는 이름에서 알 수 있듯이 장식하는 역할을 한다. 주로 기존의 함수를 수정하고 싶지는 않지만 추가 기능을 구현하고 싶을 때 사용한다.
decorator는 특정 함수를 실행하기전에 강제적으로 다른 함수를 먼저 실행시키고 다시 그 함수를 실행시켜주는 역할을 하기도 한다.
say_whee 라는 변수는 my_decorator 함수의 리턴 값을 할당 받는다.
my_decorator라는 함수의 리턴값은 wrapper이라는 함수이다. 즉, say_whee 는 함수이다.
__name__
속성으로 쉽게 접근할 수 있다. 아래를 통해 say_whee 가 wrapper 함수임을 알 수 있다. >>> say_whee.__name__
wrapper
>>> say_whee()
Something is happening before the function is called.
Whee!
Something is happening after the function is called.
wrapper 함수의 정의대로 프린트를 해준다. 바깥 함수 (my_decorator)에서 전달 받은 func 도 호출한다.
이 func은 데코레이팅을 받지 않은 say_whee() 이다. func()이 #4에서 불렸을때 #5의 정의대로 Whee!를 프린트한다.
say_whee 를 뒤에 괄호를 붙이지 않고 프린트할 경우 다음과 같은 결과가 나온다.
>>> say_whee
<function my_decorator.<locals>.wrapper at 0x7f3c5dfd42f0>
이 말은 say_whee 라는 변수는 my_decorator()라는 parent function의 안에 있는 local function 이라는 뜻이다.
이는 파이썬 함수의 특징인데, 괄호를 붙이지 않으면 다른 객체와 마찬가지로 간주한다.
user app folder 안에 utils.py를 생성하여 그 안에 login_decorator를 만들어주자. 나중에 utils.py를 views.py에서 import를 해주면 된다.
먼저 import 해줄 것들을 해주자.
다음과 같은 login_decorator의 코드를 짠 부분이다:
- token을 headers의 'Authorization'에서 받는다.
##4-2를 확인해보면 요청에 토큰을 어떻게 보내야하는지 알수있다.- payload에는 request에 보낸 유저의 정보가 담긴다.
- request에 보낸 유저의 이메일을 가진 User 객체를 담는다.
- request에 token이 없다면 에러를 보낸다.
- 존재하지 않는 유저라면 에러를 보낸다.
def get, def post 등의 앞에 @login_decorator를 붙여주면 된다.
결과:
받은 토큰은 "Authorization:토큰" 의 형식으로 요청을 보내준다. login_decorator 에서 이를 처리하여 토큰으로 로그인을 하고 post를 성공시킨다.
결과:
print:
token, payload, user를 순서대로 프린트 해보았다.