[TIL] Django Westagram: login_decorator, token

Jene Hojin Choi·2021년 2월 6일
0

Django

목록 보기
6/12
post-thumbnail

1. 로그인을 해야만 할 수 있는 기능들

어느 사이트이건, 회원가입을 해서 로그인을 해야만 게시글을 올릴 수 있고, 댓글을 달 수 있고, 다른 사람 혹은 나 자신의 게시글에 좋아요를 누를 수 있을 것이다.

이것을 views.py에서 구현하려면 어떻게 해야할까? decorator 를 사용해야만 한다!

2. Decorator

그렇다면 decorator는 무엇일까? Decorator는 이름에서 알 수 있듯이 장식하는 역할을 한다. 주로 기존의 함수를 수정하고 싶지는 않지만 추가 기능을 구현하고 싶을 때 사용한다.

decorator는 특정 함수를 실행하기전에 강제적으로 다른 함수를 먼저 실행시키고 다시 그 함수를 실행시켜주는 역할을 하기도 한다.

코드 예시와 설명

  1. say_whee 라는 변수는 my_decorator 함수의 리턴 값을 할당 받는다.

  2. my_decorator라는 함수의 리턴값은 wrapper이라는 함수이다. 즉, say_whee 는 함수이다.

  • 파이썬은 함수가 생성되는 시점에 구분자(identifier)를 붙여준다. 이를 __name__ 속성으로 쉽게 접근할 수 있다. 아래를 통해 say_whee 가 wrapper 함수임을 알 수 있다.
>>> say_whee.__name__
wrapper
  1. say_whee는 변수이면서 함수이므로, 뒤에 괄호()를 붙여 실행시켜보자.
>>> say_whee()
Something is happening before the function is called.
Whee!
Something is happening after the function is called.
  1. wrapper 함수의 정의대로 프린트를 해준다. 바깥 함수 (my_decorator)에서 전달 받은 func 도 호출한다.

  2. 이 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 이라는 뜻이다.

이는 파이썬 함수의 특징인데, 괄호를 붙이지 않으면 다른 객체와 마찬가지로 간주한다.

decorate 방식 두가지

1. my_decorator(func)

2. @my_decorator

3. login_decorator

3-1. import

user app folder 안에 utils.py를 생성하여 그 안에 login_decorator를 만들어주자. 나중에 utils.py를 views.py에서 import를 해주면 된다.

먼저 import 해줄 것들을 해주자.

3-2. login_decorator

다음과 같은 login_decorator의 코드를 짠 부분이다:

  1. token을 headers의 'Authorization'에서 받는다.
    ##4-2를 확인해보면 요청에 토큰을 어떻게 보내야하는지 알수있다.
  2. payload에는 request에 보낸 유저의 정보가 담긴다.
  3. request에 보낸 유저의 이메일을 가진 User 객체를 담는다.
  4. request에 token이 없다면 에러를 보낸다.
  5. 존재하지 않는 유저라면 에러를 보낸다.

3-3. views.py 의 일부

def get, def post 등의 앞에 @login_decorator를 붙여주면 된다.

4. post 시도해보기

4-1. login

결과:

4-2. post with token

받은 토큰은 "Authorization:토큰" 의 형식으로 요청을 보내준다. login_decorator 에서 이를 처리하여 토큰으로 로그인을 하고 post를 성공시킨다.

결과:

print:

token, payload, user를 순서대로 프린트 해보았다.

0개의 댓글