Nonamed Develog
[TIL][240906] Troubleshooting 3: url routing의 순서 본문
문제 상황
products 앱에서 CategoryViewSet으로 요청을 보낼 때, Postman에서 {"detail": "Not found."} 응답을 받는 문제가 발생했다. ProductViewSet은 정상적으로 작동했지만, categories/ 경로에 요청이 처리되지 않았다.
문제 원인
라우팅 설정에서, 빈 경로로 등록한 ProductViewSet이 /categories/ 경로를 포함한 모든 요청을 가로채면서, CategoryViewSet으로의 요청이 제대로 전달되지 않았다.
초기 코드
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductViewSet, CategoryViewSet
router = DefaultRouter() # 라우터 생성
router.register(r'', ProductViewSet) # 'products' 엔드포인트에 ProductViewSet 등록
router.register(r'categories', CategoryViewSet) # 'categories' 엔드포인트에 CategoryViewSet 등록
urlpatterns = [
path('', include(router.urls)), # 라우터에서 생성된 URL 패턴 포함
]
이 코드에서 빈 경로 r''로 ProductViewSet을 먼저 등록했기 때문에, 모든 경로에 대한 요청을 가로채고 있었다. 따라서 /categories/ 경로로의 요청도 ProductViewSet에서 처리되어 {"detail": "Not found."} 응답을 받았다.
디버깅 과정
- Postman 테스트
categories/ 경로에 GET 요청을 보냈으나, {"detail": "Not found."} 응답을 받았다. - 라우팅 패턴 확인
show_urls 명령어로 등록된 URL 패턴을 확인해보니, /categories/ 경로가 제대로 등록되지 않은 것을 발견했다. - 문제 분석
빈 경로(r'')로 먼저 등록된 ProductViewSet이 /categories/를 포함한 모든 경로를 가로채고 있었다. 따라서 CategoryViewSet이 요청을 처리하지 못한 것이다.
해결 방법
라우팅 순서를 수정하여, 더 구체적인 categories/ 경로를 먼저 등록하고, 그 후에 ProductViewSet을 등록했다.
수정 코드
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductViewSet, CategoryViewSet
router = DefaultRouter() # 라우터 생성
router.register(r'categories', CategoryViewSet) # 'categories' 엔드포인트에 CategoryViewSet 등록
router.register(r'', ProductViewSet) # 'products' 엔드포인트에 ProductViewSet 등록
urlpatterns = [
path('', include(router.urls)), # 라우터에서 생성된 URL 패턴 포함
]
결과
라우팅 순서를 변경한 후, Postman에서 categories/ 경로로 요청을 다시 테스트했을 때, 정상적으로 응답을 받을 수 있었다.
배운 점
- 라우팅 순서의 중요성: Django에서 라우트를 설정할 때, 구체적인 경로를 먼저 등록하는 것이 중요하다. 빈 경로를 먼저 등록하면 모든 경로를 가로챌 수 있으므로 주의해야 한다.
- DefaultRouter 사용 시 주의점: 빈 경로를 사용하면 해당 ViewSet이 최상위 경로부터 모든 하위 경로까지 처리할 수 있으므로, 경로 설정 시 우선순위를 고려해야 한다.
'WHAT I LEARN > TIL' 카테고리의 다른 글
[TIL][240911] 프로젝트 시작, 끝 없는 문서 작성...(SA) (1) | 2024.09.11 |
---|---|
[TIL][240910] Django와 웹 크롤링 (2) | 2024.09.10 |
[TIL][240906] Troubleshooting 2: 중복된 코드의 냄새 (0) | 2024.09.06 |
[TIL][240905] RefreshToken 속 check_blacklist() (0) | 2024.09.05 |
[TIL][240904] Troubleshooting 1: validaors.py의 활용 (0) | 2024.09.04 |