TIl. AI 팀프로젝트(2) drf permission

2023년 05월 23일 by barryjung

    TIl. AI 팀프로젝트(2) drf permission 목차

[오늘 한일]

  • 프로젝트 진행

 

[오늘 배운점]

오늘은 user 기능을 다 만들었다.

지난 프로젝트를 바탕으로 만들다보니 금방금방 작성 가능했다.

user는 다른 분이 만들었었는데, 내가 작성하면서 꼼꼼히 복습하는 기회가 되었다.

 

DRF

<DRF permissions 종류>

장고 DRF는 permission이란걸 제공한다.

views 각 객체에 permission classes로 지정해줄수 있다.

그럼 객체에 대한 권한이 한줄로 해결이다.

 

※ 이때 permission classes = 에 오타가 없도록 유의해야 한다.

상위 클래스 속성을 가져오는 거다보니, 오타 표시가 잘 안될수 있다.

모듈 파일을 열어서 단어를 복사해오는게 좋은 방법이다.

 

 

위처럼 view에서는 permission 객체를 지정하고,

permission 객체는 필요할 경우 permissions에서 커스텀해주거나,

기본 제공되는 몇가지 permissions 중에 사용하면 된다.

 

이번에 유저쪽도 약간의 변경내용이 있어,

permission을 적합하게 주려고 permission을 자세히 들여다 보았다.

 

기본 제공 permission은,

AllowAny, IsAuthenticated, IsAdminUser, IsAuthenticatedOrReadOnly이 있다.

이름에서부터 어떤걸 의미하는지 알수있다.

다 허용하거나, 로그인이 필요하거나, 관리자일경우가 있고,

예외로 로그인 혹은 읽기만 허용이라는 객체도 있다.

 

커스텀 permission을 만들때는 

BasePermission을 상속해서 만들면 적합하다.

내용이 비어있는 추상클래스이다. (모듈에서 이렇게 정식적인 추상클래스는 처음 보게됬다)

 


<커스텀 permission과 코드스타일>

class IsAuthenticatedOrReadOrSignUp(permissions.BasePermission):
    def has_permission(self, request, view):
        """UserSignview 전용 퍼미션
        
        UserSignview는 GET과 POST(회원가입)요청을 허용해야 합니다.
        이외에는 로그인 여부를 확인합니다.
        
        Returns:
            True: GET, POST요청이거나 로그인 정상
            False: 그외의 경우
        """
        return bool(
            request.method in ('GET', 'POST') or
            request.user and
            request.user.is_authenticated
        )

위는 내가 만든 커스텀 퍼미션의 코드이다.

signview를 처리하기 위해 전용 퍼미션을 만들었다.

 

signview는 회원관련 기능을 하나로 묶은 view이다.

회원가입(post), 회원정보조회(get), 회원정보수정(patch), 회원탈퇴(put)을 처리한다.

 

이중, 회원가입과 회원정보조회는 로그인 없이도 가능해야 하고,

나머지 두개는 로그인이 필요해야 한다.

그렇다보니 get만 허용해주는 IsAuthenticatedOrReadOnly을 사용할까 싶었지만,

적합하지 않다는걸 확인했고 커스텀 퍼미션을 만들게 되었다.

 

 

코드 작성스타일을 일부로 모듈 파일에 IsAuthenticatedOrReadOnly와 비슷하게 만들었다.

저렇게 bool () 튜플로, 튜플안에서 허용여부에 영향을 주는 요소들로 조건식을 만들었다.

 

bool연산을 이용해, 참거짓 판명에 한해서 조건문을 대체하면서도,

한눈에 보기도 간결한 작성으로 아주 좋은 작성법인것 같다.

 

원래 IsAuthenticatedOrReadOnly에선

'get', 'post'의 튜플대신 SAFE_METHODS라는 전역변수를 사용한다.

SAFE_METHODS는 permissions 모듈파일 상위에서 ('GET', 'HEAD', 'OPTIONS')으로 정의되어있다.

그래서 전역변수 선언은 생략하고 GET과 POST만 담아주었다.

 


지난 프로젝트 마지막에도 인상깊은 코드로 퍼미션을 꼽았었다.

오늘도 유저를 쭉 작성하면서 흥미있게 작업한 부분이 이부분이였다.

 

permission, pagination, serializer가 정말 DRF의 restful의 핵심인것 같다.

가능하다면 이외에도 다른 기능들도 익혀보고싶다.