Seongwon Lim

[Django] Rest framework 다루기 (2) 본문

Django

[Django] Rest framework 다루기 (2)

limsw 2022. 5. 9. 21:10
반응형

서론

 

이번 글은 Rest framework를 이용하여 생성한 모델을 가지고 CRUD를 하는 방법을 다룰 예정이다. 따라서 모델과 필드가 이미 정의된 상태에서 진행하는 글이므로 개발 환경 준비가 되지 않은 분들은 이전 포스팅 글을 참고하면 좋을 것 같다.

이론

장고에서 API 기능의 구현은 대부분 views.py 에서 다룬다.
이전 포스팅에서 views.py 파일에 Viewset을 이용하여 테이블 데이터를 읽어오는 기능을 구현 했었다.

 

이번에는 Viewset을 이용하지 않고 직접 Request 유형을 파악하여 정의된 모델에 데이터를 추가, 삭제 및 수정하는 작업을 해볼 것이다.

 

이전 포스팅 글을 참조하여 실습을 진행했다면 localhost:8000/accounts 경로로 GET 요청을 보냈을 때 데이터가 다음과 같이 보여질 것이다.

(참고로 localhost:8000/accounts/1 이런 식으로 요청을 보내면 id=1인 유저를 반환했었다.)

데이터 생성하기

데이터를 생성할 때는 POST 요청을 사용한다.
views.py 파일에 다음과 같이 코드를 추가하여 회원가입 기능을 구현할 수 있다.

from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Account
from .serializers import AccountSerializer
from rest_framework.parsers import JSONParser

# 계정 회원가입
@csrf_exempt
def singup(request):
    if request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = AccountSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

signup 함수를 정의했고 이 함수는 Request 요청이 POST인 경우 Serializer를 이용하여 body에 담긴 데이터가 유효한지 확인 후 유효하다면 테이블에 데이터를 저장해주는 코드이다.

 

정의된 함수를 사용하기 위해서는 login/urls.py 파일을 다음과 같이 수정한다.

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace="rest_framework")),
    path('signup', views.signup) # 해당 부분을 추가
]

이제 localhost:3000/signup 경로에 POST요청을 주어 데이터를 추가해보도록 하자.

포스트맨을 이용하여 위와 같이 데이터를 입력 후 Send 버튼을 누르면?

정의한 대로 Response가 적절하게 오는 것을 확인할 수 있다. 또한 localhost:8000/accounts 경로로 GET 요청을 보내보면

데이터가 추가된 것을 확인할 수 있다.

id를 이용하여 데이터 수정 및 삭제하기

데이터를 수정하는 경우 PUT 메서드를 이용하고 데이터를 삭제하는 경우 DELETE 메서드를 이용한다.

 

필자는 두 개의 메서드를 위한 함수를 따로 정의했다. 코드는 다음과 같다.

# id를 통한 계정 수정, 삭제
@csrf_exempt
def account(request, pk):

    obj = Account.objects.get(pk=pk)

    if request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = AccountSerializer(obj, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        obj.delete()
        return HttpResponse(status=204)

account 이름을 가진 함수를 정의했으며 이 안에는 수정, 삭제 기능을 구현했다.

obj 변수는 Account 모델에 접근하여 파라미터로 받은 pk 값을 이용해서 해당 pk값과 매핑되는 키 값을 가진 객체를 저장한 변수이다.

 

해당 함수를 사용하기 위해서는 아까처럼 login/urls.py 파일을 수정한다.

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace="rest_framework")),
    path('signup', views.signup),
    path('accounts/<int:pk>', views.account) # 해당 부분 추가
]

이제 localhost:3000/accounts/1 경로에 PUT, DELETE 메서드를 각각 적용해보자.

PUT 결과 확인하기

이름, 이메일, 패스워드를 모두 수정 후 요청을 보내면 다음과 같은 응답을 얻을 수 있다.


또한 localhost:3000/accounts/1에 GET 요청을 통해 결과를 확인하면

값이 변경된 것을 확인할 수 있다.

DELETE 결과 확인하기

삭제를 하는 경우는 마찬가지로 Account 모델에 접근한 뒤 파라미터로 받은 pk값과 일치하는 키가 있는 경우 해당 객체를 삭제하는 것이다.

 

DELETE의 경우 Body에 들어가는 데이터는 없으며 응답 결과도 StatusCode 이외에는 별다른 결과에 대한 응답이 존재하지 않는다. 다만 요청이 잘 처리된 경우 숫자 1을 반환한다.


이제 localhost:3000/accounts 경로에 GET 요청을 주어 전체 데이터를 조회해보면

id값 1을 가진 데이터가 삭제된 것을 확인할 수 있다.

'Django' 카테고리의 다른 글

[Django] Rest framework 다루기 (1)  (0) 2022.05.09
[Django] CORS 에러 해결하기  (0) 2022.05.07
Comments