본문 바로가기
DEV/Web 개발

Web 개발 :: 파이썬 Django Rest Framework(9) _ 게시글 상세, 수정, 삭제

by 올커 2022. 11. 2.

DRF(Django Rest Framework)(9) _ 게시글 상세, 수정, 삭제

01. 게시글 상세 페이지

 - 게시글 상세페이지는 views.py의 ArticleDetailView에서 get함수를 통해 가져온다.

 - Serializer는 ArticleSerializer를 사용하고, 해당 article을 넣어준 후 Response에 넘겨준다.

# articles/views.py

class ArticleDetailView(APIView):
    ...
    # 게시글 상세페이지 불러오기
    def get(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        serializer = ArticleSerializer(article)
        return Response(serializer.data, status=status.HTTP_200_OK)

 - 함수내에서 article = Article.objects.all()로 모두 가져올 수 있지만, 가져오지 못 할 경우 404에러를 발생시키기 위해 get_object_or_404(모델명, 해당 게시글 id)를 사용하였다.

 - 포스트맨에서 리퀘스트를 만들고 요청하면 아래와 같이 잘 나타나고 있음을 확인할 수 있다.


02. 게시글 수정하기

 - 게시글 수정하기는 ArticleDetailView에서 함수만 put으로 하여 새로 지정하였다.

 - article은 동일하게 get_object_or_404를 통해 해당 게시글의 내용 및 속성정보를 가져오고, serializer는 ArticleCreateSerializer를 사용했다. 가져온 article과 request.data를 data에 넣어준다.

 - 유효성 검증(is_valid)이 완료가 되면 저장하고 Response로 넘겨준다.

# articles/views.py

class ArticleDetailView(APIView):
    ...
    # 게시글 수정하기
    def put(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        serializer = ArticleCreateSerializer(article, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 - 포스트맨에서 PUT 방식으로 요청하면 수정이 잘 되는 것을 확인할 수 있다.

 - 그러나 현재 방식으로는 다른 사용자로 로그인되어도 수정이 가능한 상태이다. 이를 해결하기 위해 코드를 아래와 같이 수정해주었다. request.user가 article.user와 동일한지 검사하고, 맞다면 수정을 진행하고, 다르다면 "권한이 없습니다!"와 함께 403 Forbidden Error를 발생시킨다.

# articles/views.py

class ArticleDetailView(APIView):
    ...
    # 게시글 수정하기
    def put(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        if request.user == article.user:
            serializer = ArticleCreateSerializer(article, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)

 - 검증할 때에는 포스트맨에서도 새로운 계정으로 로그인 한 후 access 토큰을 복사하여 우리가 지정한 local environment의 token값에 업데이트해주어야 한다.

 

 - 변경이 완료된 후 다시 동일한 put request를 진행해보면 아래와 같이 "권한이 없습니다!" 문구와 함께 403 Forbidden이 나타나는 것을 확인할 수 있다.


03. 게시글 삭제하기

 - 게시글 삭제도 위의 함수들과 크게 다르지 않으며, 사용자 인증이 되었을 때 article을 삭제할 수 있도록 delete()명령어를 수정해주었다. 추가로 Response되는 화면은 204 NoContent를 띄워준다.

# articles/views.py

class ArticleDetailView(APIView):
    ...
    # 게시글 삭제하기
    def delete(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        if request.user == article.user:
            article.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
        else:
            return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)

 - 검증할 때도 마찬가지로 Environment의 토큰이 삭제하고자 하는 article의 user정보가 맞는지 확인하고, 맞지않다면 토큰을 바꾸어 준 뒤에 delete실행을 해야 정상적으로 삭제가 된다.

 

반응형

댓글