카테고리 없음

custom - permissions.py

abccoco 2022. 6. 24. 21:07

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)))