[Django] Build RESTful API

한결·2023년 4월 17일
0

WEB

목록 보기
23/63
post-thumbnail

Build RESTful API

Article

POST

게시글 데이터 생성하기

  • 요청에 대한 데이터 생성이 성공했을 경우는 201 Created 상태 코드를 응답하고 실패 했을 경우는 400 Bad request를 응답
@api_view(['GET', 'POST'])
def article_list(request):
    if request.method == "GET":
        articles = Article.objects.all()
        serializer = ArticleListSerializer(articles, many=True)
        return Response(serializer.data)
    
    elif request.method == "POST": # GET, POST외에도 많은 HTTPmethod 있으니까 elif로 확실히 나눔 
        serializer = ArticleListSerializer(data = request.data) # 역직렬화
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED) # 직렬화
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # 에러가 낫을 때 에러를 담아서 줄지 빈객체를 줄지 클라이언트 개발자랑 협의하는 거임

Raising an exception on invaild data
"유효하지 않은 데이터에 대해 예외 발생시키기"

  • is_valid()는 유효성 검사 오류가 있는 경우 ValidationError 예외를 발생시키는 선택적 raise_exception 인자를 사용할 수 있음
  • DRF에서 제공하는 기본 예외 처리기에 의해 자동으로 처리되면 기본적으로 HTTP 400 응답을 반환 (raise_exception=True로 하면 알아서 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 처리해줌 )
    -> 코드 깔끔해짐
  • view 함수 코드 변경

DELETE

게시글 데이터 삭제하기

  • 요청에 대한 데이터 삭제가 성공했을 경우는 204 No Content 상태 코드 응답 (명령을 수행했고 더 이상 제공할 정보가 없는 경우)
@api_view(['GET', 'DELETE'])
def article_detail(request, article_pk):
    if request.method == "GET":
        article = Article.objects.get(pk=article_pk)
        serializer = ArticleListSerializer(article)
        return Response(serializer.data)
    
    elif request.method == "DELETE" : 
        article = Article.objects.get(pk = article_pk)
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
  • 반복되는 데이터 안좋으니까 수정 (code smell)
@api_view(['GET', 'DELETE'])
def article_detail(request, article_pk):
    article = Article.objects.get(pk=article_pk)
    if request.method == "GET":
        serializer = ArticleListSerializer(article)
        return Response(serializer.data)
    
    elif request.method == "DELETE" : 
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

PUT

게시글 데이터 수정하기

  • 요청에 대한 데이터 수정이 성공했을 경우는 200 OK 상태 코드 응답
@api_view(['GET', 'DELETE','PUT'])
def article_detail(request, article_pk):
    article = Article.objects.get(pk=article_pk)
    if request.method == "GET":
        serializer = ArticleListSerializer(article)
        return Response(serializer.data)
    
    elif request.method == "DELETE": 
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
    
    elif request.method == "PUT":
        # 입력 데이터 가져오고 save
        serializer = ArticleListSerializer(article, data = request.data) # 역직렬화
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data) # 직렬화

이전까지는 MTV 모두 사용했지만
M -> V 처리만 함
-> 백앤드 개발자의 많은 부분이 이러한 작업을 하는 것
-> T는 클라이언트 사이드에서 함

0개의 댓글