[Westagram] : 게시글/댓글 삭제

Kiyong Lee·2021년 10월 3일
0

Django

목록 보기
25/35
post-custom-banner

과제


코드


urls.py

from django.urls    import path

from postings.views import PostingView, PostingUpdateView

urlpatterns = [
    path('post',           PostingView.as_view()),
    path('delete/<int:id>',PostingView.as_view()),
    path('post/<int:id>'  ,PostingUpdateView.as_view())
]

from django.urls    import path

from comments.views import (
    CommentsGetView,
    CommentsPostView,
)
urlpatterns = [
    path('post',            CommentsPostView.as_view()),
    path('get/<int:id>',    CommentsGetView.as_view()), #id는 post의 id 기준으로 잡아야 함
    path('delete/<int:id>', CommentsGetView.as_view()),
]

url을 설정할 때 delete 뒤에 <int:id> 라고 써놓은 게 있다.

문제에서 body를 안 받는다고 한 것과 연결되는 데 삭제의 경우

다른 데이터를 받을 게 없이, id가 몇 번인 것만 삭제한다고 요청하면 돼서

뒤에 id를 붙이게 된 것이다.

이게 바로 그 rest api? 라고 한다. (이거는 나도 자세하게는 잘 몰라서 공부해야 함)


views.py + 데코레이터


    @login_decorator
    def delete(self, request, id) :
        try :
            posting_id = id

            if not Posting.objects.filter(id=posting_id).exists() :
                return JsonResponse({'message':'Posting is not existed'}, status=400)

        except KeyError :
            return JsonResponse({'message':'KEY_ERROR'}, status=400)
        
        Posting.objects.filter(id=posting_id).delete()

        return JsonResponse({'message':'delete ok'}, status=200)

    @login_decorator
    def delete(self, request, id) :
        try :
            comment_id = id

            if not Comment.objects.filter(id=comment_id).exists() :
                return JsonResponse({'message':'삭제할 수 없는 댓글입니다'}, status=400)

        except KeyError :
            return JsonResponse({'message':'KEY_ERROR'})

        Comment.objects.filter(id=comment_id).delete()
        return JsonResponse({'message':'comment delete'}, status=200)

로그인이 되어 있어야 하므로 login_decorator 함수를 우선적으로 실행한다.

그리고 데코레이터의 파라미터들과 rest api 설정에 관해 연관성이 있는데
(아래 내용들은 내 생각임, 반박 시 님들 말이 맞음)

일반적인 조회와 등록은 self, request만 있으면 되지만 수정과 삭제는

무조건 특정 대상이 포함되어야 한다.

예를 들어, 어떤 걸 수정할건지? 어떤 걸 삭제할건지?

그래서 views.py의 메서드에 대상의 변수를 가져오는데, 여기선 그게 바로 id이다


def login_decorator(func) :
    def wrapper(self, request, *args, **kwargs) :

데코레이터를 시작할 때 변수를 self, request, *args, **kwargs 4개를 잡았는데

만약 self, request만 설정한다면, 내가 delete 메서도에서 설정한 변수 id를
데코레이터에서 받을 수 없어서 에러가 발생한다.

그래서 데코레이터에 args, kwargs를 추가 파라미터로 선언했다.

어쨌든, 이미 삭제되었는지 확인해서 미리 삭제된거면 메시지띄우고 아니면 삭제하고가 끝

profile
ISTJ인 K-개발자
post-custom-banner

0개의 댓글