본문 바로가기
Coding/Python

Django Restframework HTTP Method Override하는 방법

by Hide­ 2018. 3. 16.
반응형

Django Rest framework를 사용하여 API서버를 구축했다.

기본적으로 제공되는 기능도 충분히 훌륭하지만 좀 더 세부적인 컨트롤을 위해서는

Function을 Override하여 나의 서비스에 맞게 수정해주는 작업이 필요하다.

Rest framework는 말그대로 Restful 한 API서버이므로 모든 작업은

HTTP Method를 통한다.

GET, PUT, DELETE 등의 HTTP Method들에 따라 하는 작업이 다르다.

나같은 경우에는 어플리케이션에서 익명 게시판 기능이 존재하는데,

사용자가 입력한 패스워드와 데이터베이스에 저장된 패스워드가 일치할 때만 글을 삭제하게 만들어줘야 했다.

따라서 ViewSet관련 글들을 찾아보다가 기본적으로 제공해주는 Method가 여러가지 있는걸 발견했다.


http://www.django-rest-framework.org/api-guide/viewsets/


Rest framework 공식 홈페이지로 들어가보면 다음과 같이 우리가 사용할 수 있는 함수들이 나와있다.


여기서 자주 쓰이는 부분을 설명을 해보자면,


- def list : 단순 GET 메소드를 통해 전체 리스트를 조회

- def create : POST 메소드를 사용하여 값을 삽입

- def retrieve : GET 메소드를 통해 단일 값 조회

- def update : PUT 메소드를 사용하여 값 수정

- def destroy : DELETE 메소드를 사용하여 값 삭제


정도가 되겠다.

위에서 설명했듯이 나는 DELETE 메소드를 통해 값을 삭제할 때 특정 조건을 넣어줘야 하므로

destroy() 함수를 override하면 된다.

먼저 기존 ViewSet은 다음과 같았다.


단순히 모든 값들을 가져오고 뿌려주는 작업이다.

위에서 설명한 함수 중 단 한가지도 override하지 않았다.

이제 다음 소스는 destroy() 함수를 override한 부분이다.


요청에 password를 같이 보내줄 것이므로 password를 가져왔고

(지금 보면서 생각난건데 article_id는 쓰이는 곳이 없으므로 지워도 된다)

instace변수에 현재 값의 object를 담아줬다.

그리고 사용자가 입력한 패스워드와 현재 값의 패스워드가 일치한다면

perform_destroy를 통해 값을 삭제해줬다.

그리고 정상적으로 삭제가 됐는지 알려주기 위해 204 NO CONTENT를 return해줬다.

패스워드가 일치하지 않는다면 304 NOT MODIFIED를 return해준다.

위처럼 작업을 해준다면 Django Restframework를 좀 더 자신의 입맛에 맞게 사용할 수 있을 것 같다.


perform_destroy() 등의 메소드명이 궁금하다면 아래의 사이트에서 자세히 확인해볼 수 있다.


http://www.cdrf.co/3.1/rest_framework.viewsets/ModelViewSet.html


위 사이트에 들어가서 원하는 함수명을 찾아보면 아래와 같이

인자들, 예제코드까지 확인할 수 있다.