custom - permissions.py
permission class는 기존의 permission 을 import 해서 사용하던 권한 설정을
내가 permissions.py를 만들어,
내가 원하는데로 권한 설정을 바꿀 수 있도록 한다. custom class를 만드는 것이다.
(내가 만든 permisson class를 import 해서 사용한다. 어떻게 보면 serializer 와 비슷한것도 같다.)
views.py의 기존 방식
class UserView(APIView): # CBV 방식
permission_classes = [permissions.AllowAny] # 누구나 view 조회 가능
# permission_classes = [permissions.IsAdminUser] # admin만 view 조회 가능
# permission_classes = [permissions.IsAuthenticated] # 로그인 된 사용자만 view 조회 가능
custom permission class의 방식
from 최상위app.permissions import permission class 이름(나의 class)
class UserView(APIView): # CBV 방식
permission_classes = [나의 class] # 내가 만든 permissions class
# permission_classes = [permissions.AllowAny] # 누구나 view 조회 가능
# permission_classes = [permissions.IsAdminUser] # admin만 view 조회 가능
# permission_classes = [permissions.IsAuthenticated] # 로그인 된 사용자만 view 조회 가능
이제부터 가입일 기준 1주일 이상 지난 사용자만 접근 가능한 class 를 만드는 방법을 알아보자.
permission class는 여러 앱에서 사용할 수 있도록 메인 app에 permissions.py 를 만들어 작성해준다.
다음으로는 rest_framework.permissions 에서 import를 해준다.
from rest_framework.permissions import BasePermission
다음으로는 class 와 함수를 만들어주고 함수 안에 어떤 동작을 시킬 것인지를 정해주면 된다.
return False or True 를 통해 권한 설정을 해 줄 수 있다.
False or True 를 사용하기 때문에 bool() 를 사용할 수 도 있고 if문을 사용해서 권한을 설정할 수도 있다.
from rest_framework.permissions import BasePermission
class RegistedMoreThanAWeekUser(BasePermission):
def has_permission(self, request, view):
return ""
model 필드인 Datefield 와 Datetimefield 의 권한 설정 방법을 알아보자.
가입 후 7일이 지난 뒤 사용 가능 권한 만들기!
각각의 model 필드에 따라 어떤것을 import 하고 사용할지가 정해진다.
# Datefield 의 import
from datetime import timedelta
# Datetimefield 의 import
from django.utils import timezone
if 를 사용한 권한 설정(Datefield)
from rest_framework.permissions import BasePermission
from datetime import timedelta
from django.utils import timedelta
class 클레스명(BasePermission):
def has_permission(self, requset, view):
user = request.user
if not user or not user.is_authenticated:
return False
# datetime의 날까지만 데이터 가져온다
# timedelta 를 impot 하면 날짜 연산일 가능하다.
if user.join_date > datetime.now().date() - timedelta(days=7):
return True
# Date field : 연-월-일
# DateTime field : 연-월-일-시
bool 을 사용한 권한설정(Datetimefield)
from rest_framework.permissions import BasePermission
from datetime import timedelta
from django.utils import timezone
class RegistedMoreThanAWeekUser(BasePermission):
message = '가입 후 1주일 이상 지난 사용자만 사용하실 수 있습니다.'
def has_permission(self, request, view):
return bool(request.user and request.user.join_date < (timezone.now() - timedelta(days=7)))