이전에 포스트 했던 회원가입 & 로그인 기능에 이어서
웹 사이트의 user인지 확인하는 인가 데코레이터 기능을 구현해보자!
이 데코레이터를 이용해 회원만이 할 수 있는 기능을 추가적으로 작업할 수 있다.
앱 안에 utils.py 파일을 생성해 그 곳에 작성한다.
import json
import jwt
from django.http import JsonResponse
from westagram.settings import (
SECRET_KEY,
ALGORITHM
)
from .models import Account
def login_required(func):
def wrapper(self, request, *args, **kwargs):
try:
access_token = request.headers.get('Authorization', None)
user_id = jwt.decode(access_token, SECRET_KEY, algorithm = ALGORITHM)['id']
user = Account.objects.get(id = user_id)
request.user = user
return func(self, request, *args, **kwargs)
except jwt.exceptions.DecodeError:
return JsonResponse({'message' : 'INVALID_TOKEN'}, status = 400)
except Account.DoesNotExist:
return JsonResponse({'message' : 'UNKNOWN_USER'}, status = 404)
except KeyError:
return JsonResponse({'message' : 'INVALID_KEY'}, status = 400)
return wrapper
이제 위에서 만든 데코레이터를 활용하여 유저만이 할 수 있는 기능을 만들 수 있다. 👊
로그인 한 사용자만 댓글을 달 수 있는 댓글기능을 만들어보자.
먼저 댓글 앱을 만들고 모델을 작성해준다.
(project) $ ./manage.py startapp comment
from django.db import models
class Comment(models.Model):
email = models.ForeignKey('account.Account', on_delete = models.SET_NULL, null=True)
comment = models.CharField(max_length = 1000)
class Meta:
db_table = 'comments'
import json
from django.views import View
from django.http import (
HttpResponse,
JsonResponse
)
from account.utils import login_required
from account.models import Account
from .models import Comment
class CommentView(View):
@login_required
def post(self, request):
data = json.loads(request.body)
try:
Comment.objects.create(
email = Account.objects.get(email = request.user.email),
comment = data['comment']
)
return HttpResponse(status = 200)
except KeyError:
return JsonResponse({'message' : 'INVALID_KEY'}, status = 400)
#comment/urls.py
from django.urls import path
from .views import CommentView
urlpatterns = [
path('', CommentView.as_view()),
]
http -v localhost:8000/comment 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyLWlkIjo1fQ.tBQu0HfnOYK7lL3tH5ImgsI-y4Jz1RKscJWbV3U2QMI' comment='hello'