1. Method \POST\ not allowed
DRF중 TokenBlacklistView를 사용해 logout을 하려고 했을 때 postman에서 아래와 같은 오류가 발생하였다.
분명 post 메소드로 잘 전달했고 만들어져있는 뷰를 가져다 썼기 때문에 뷰나 시리얼라이저에는 이상이 있을 수가 없었다.
처음엔 아래와 같이 urlpatterns가 작성되어있었다
urlpatterns = [
...
path("<str:username>/", views.Profile.as_view(), name="profile"),
path("logout/", TokenBlacklistView.as_view(), name="token_blacklist"),
...
]
이를 다음과 같이 수정해서 작동시키니 잘 작동되었다
urlpatterns = [
...
path("<str:username>/", views.Profile.as_view(), name="profile"),
path("auth/logout/", TokenBlacklistView.as_view(), name="token_blacklist"),
...
]
로그아웃의 url 앞에 auth를 붙여주는 방법을 통해 해결하였다. 하지만 왜 이런 방법으로 해결하는지 이해하지 못하였는데,
이후에 해답을 찾을 수 있었다.
문제는 urlpatterns의 순서에 있었다.
logout을 usrname으로 인식하고 로그아웃이 동작하는 것이 아닌 Profile 뷰에 대해 실행이 이루어져 Method \POST\ not allowed와 같은 오류가 발생했던 것이다
이 문제를 해결하기 위해서는 두 url의 순서를 바꾸어주는 방법으로 해결할 수 있었다.
urlpatterns = [
...
path("logout/", TokenBlacklistView.as_view(), name="token_blacklist"),
path("<str:username>/", views.Profile.as_view(), name="profile"),
...
]
이렇게 작성해주면 logout의 앞에 auth를 작성해주지 않아도 정상적으로 logout을 할 수 있었다.
물론 이렇게 작성해주기 위해서 username이 logout인 사람이 없도록 미리 username을 등록해주는 것이 필요할 것이다.
2. 페이지네이션
페이지네이션을 적용하기 위해 처음에는 Django REST Framework에서 제공해주는 페이지네이션을 사용하려고 시도했다.
하지만 해당 기능은 GenericAPIView를 사용할 때 pagination_class를 통해 적용하거나 settings에서 글로벌에서 적용시켜 줄 수 있었는데 나는 일반 APIView를 사용해서 페이지네이션이 제대로 적용되지 않았다.
그래서 django에서 제공해주는 paginator를 사용해서 페이지네이션을 적용하였다.
from django.core.paginator import Paginator
...
class ProductAPIView(APIView):
...
# 상품 목록 조회
def get(self, request):
page = request.GET.get("page", "1")
products_list = Product.objects.all()
paginator = Paginator(products_list, 10)
products = paginator.get_page(page)
serializer = ProductSerializer(products, many=True)
return Response(serializer.data)
...
뷰를 다음과 같이 수정해주어 쿼리스트링을 통해 페이지에 접근해줄 수 있도록 작성해주었다
쿼리스트링을 작성해주지 않은 상태에서는 1페이지가 출력되고
페이지 번호를 입력하면 해당 페이지가 보이게 된다.
하지만 없는 페이지를 입력했을 때는 404오류가 아닌 마지막 페이지가 반환되는 것을 확인할 수 있었다
그래서 코드를 다음과 같이 수정해주었다
def get(self, request):
page = request.GET.get("page", "1")
products_list = Product.objects.all()
paginator = Paginator(products_list, 10)
if int(page) <= paginator.num_pages:
products = paginator.get_page(page)
serializer = ProductSerializer(products, many=True)
return Response(serializer.data)
else:
return Response(
{"detail": "존재하지 않는 페이지입니다"},
status=status.HTTP_404_NOT_FOUND,
)
'[내일배움캠프]스파르타코딩클럽 AI 웹개발 > Today I Learned' 카테고리의 다른 글
[TIL] project setting (0) | 2024.09.11 |
---|---|
[TIL] spartamarket-DRF 트러블 슈팅2 (1) | 2024.09.10 |
[TIL] 권한 있는 사용자 (1) | 2024.09.09 |
[TIL] TokenBlacklistView - Method \POST\ not allowed (0) | 2024.09.05 |
[TIL] 장고 기초 이해도 오답노트 (0) | 2024.09.04 |