Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- flask
- viewsets
- git
- web
- ERD
- Wil
- SQL
- CS
- github
- 코딩테스트
- 개발공부
- JWT
- Doker
- Python
- django
- 파이썬
- 아티클 스터디
- NoSQL
- nginx
- docker
- 오블완
- redis
- 장고
- 도커
- Til
- 세션(Session)
- 쿠키(cookie)
- 티스토리챌린지
- 자료구조
- 연습
Archives
- Today
- Total
SteadyDrills
Team project - blame news 3일 ~7일 차(완성) 본문
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을 블라인딩 해제 하셨습니다.'라는 문구가 나온다. - 기사 리스트 조회 시 회원이 아닌 유저는 모든 기사가 리스트로 조회되고, 회원인 경우 블라인드 한 기자의 기사를
제외한 리스트를 조회한다.
- POST메서드를 통해 다른 유저의 이름과 요청을 보내면, 첫 번째는 'username을 블라인딩 하셨습니다.'
Hate
- 이 기능을 만들게 된 이유
- '좋아요'를 대신해서 뉴스 콘셉트에 맞게 이름만 바꿨다. - 기능 구성
- POST메서드를 통해 기사의 pk와 요청을 보내면, 첫 번째는 '싫어요! 했습니다.'
반복 시 '싫어요! 취소했습니다.'라는 문구가 나온다.
- 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 |