SteadyDrills

Team project - blame news 3일 ~7일 차(완성) 본문

웹개발

Team project - blame news 3일 ~7일 차(완성)

Drills 2024. 9. 20. 22:13

240920

 

 

Category 기능


  • 이 기능을 만들게 된 이유
    - 신문 사이트를 표방하고 있기 때문에 카테고리 별로 정리해야 한다고 느꼈고
    그 때문에 생성은 기자들만 하고 조회는 누구나 할 수 있어야 한다고 생각했다.
     
  • 기능 구성(CRUD)
    • 생성 - 기자만 가능하며, 기사를 쓰기 위해서는 필수적으로 하나 이상의 카테고리가 있어야 함.
    • 조회 - 회원이라면 누구나 가능. 
    • 수정 - 기자라면 누구나 가능.
    • 삭제 - 기자라면 누구나 가능.
  • Trouble shooting

원인 코드

# 카테고리 생성 및  목록 조회
class CategoryAPIView(APIView):
	permission_classes = [IsAuthenticated]
	def get(self, request):
        category = Category.objects.all()
        serializer = CategorySerializer(category, many=True)
        return Response(serializer.data, status=200)

	permission_classes = [IsAdminUser]
    def post(self, request):
        serializer = CategorySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response({"Error": "이미 생성된 카테고리 입니다."}, status=400)

 

원인 분석 

 -  2시간을 이것저것 해보다 결국 튜터님께 갔다. 사실 코드는 크게 문제가 없었다...

   (그럼 그렇지) 다른 코드들도 문제없었는데....

   원인은 장고의  APIView의 작동 순서에 있었다. 쉽게 말해서  http요청이 들어오면 APIView는 미리 정의된 인증 및 권한

  을 확인하는 구조이기 때문에 요청보다 먼저 http요청에 따라 권한을 받을 수 있게  get_permissions 메서드를

  오버라이딩 했어야 했다.

 

해결 코드

# 카테고리 생성 및  목록 조회
class CategoryAPIView(APIView):    
    def get_permissions(self):
        if self.request.method == 'GET':
            permission_classes = [IsAuthenticated]
        elif self.request.method == 'POST':
            permission_classes = [IsAdminUser]
        else:
            permission_classes = []
        return [permission() for permission in permission_classes]

    def get(self, request):
        category = Category.objects.all()
        serializer = CategorySerializer(category, many=True)
        return Response(serializer.data, status=200)

    def post(self, request):
        serializer = CategorySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response({"Error": "이미 생성된 카테고리 입니다."}, status=400)

 

 

 Blind


  • 이 기능을 만들게 된 이유
    - 팔로잉 기능을 장고 기본 프로젝트에서 사용해 보고 이걸 활용하면, 블라인드 기능을 구현할 수 있을 거 같아서
      만들게 되었다.

  • 기능 구성
    • POST메서드를 통해 다른 유저의 이름과 요청을 보내면, 첫 번째는 'username을 블라인딩 하셨습니다.'
      반복 시  'username을 블라인딩 해제 하셨습니다.'라는 문구가 나온다.
    • 기사 리스트 조회 시 회원이 아닌 유저는 모든 기사가 리스트로 조회되고, 회원인 경우 블라인드 한 기자의 기사를 
      제외한 리스트를 조회한다.

 

Hate


  • 이 기능을 만들게 된 이유
    - '좋아요'를 대신해서 뉴스 콘셉트에 맞게 이름만 바꿨다.

  • 기능 구성
    • POST메서드를 통해 기사의 pk와 요청을 보내면, 첫 번째는 '싫어요! 했습니다.'
      반복 시  '싫어요! 취소했습니다.'라는 문구가 나온다.

 

완성(?) 후기...


장고 풀스택과는 다르게 API만을 만드는 건 또 다른 경험이었다.

또한 예상치 못한 장고의 APIView 구조 문제로 얻은 오류 덕에 많이 배웠다.

오버라이딩 하기 전 내가 사용하려는 라이브러리나 모듈이 어떻게 어떤 원리로 작동하는지 확인해야 한다는 교훈과

코드가 이상이 없다면 다른 문제가 있는지 확인해봐야 한다는 점등....

시간이 더 있었다면 대댓글이나, 검색 조회 기능 등을 더 넣어보고 싶었지만 아쉽게도 시간이 부족했다.

아쉬움도 많이 남았던 프로젝트였다.

'웹개발' 카테고리의 다른 글

NGINX란?  (1) 2024.11.06
Process Flow란?  (0) 2024.09.23
Team project - blame news 3일 차  (2) 2024.09.14
Team project - blame news 1 & 2일 차  (0) 2024.09.13
fetch API란?  (2) 2024.09.10