Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL][240906] Troubleshooting 3: url routing의 순서 본문

WHAT I LEARN/TIL

[TIL][240906] Troubleshooting 3: url routing의 순서

노네임드개발자 2024. 9. 9. 21:21

문제 상황

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."} 응답을 받았다.

디버깅 과정

  1. Postman 테스트
    categories/ 경로에 GET 요청을 보냈으나, {"detail": "Not found."} 응답을 받았다.
  2. 라우팅 패턴 확인
    show_urls 명령어로 등록된 URL 패턴을 확인해보니, /categories/ 경로가 제대로 등록되지 않은 것을 발견했다.
  3. 문제 분석
    빈 경로(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이 최상위 경로부터 모든 하위 경로까지 처리할 수 있으므로, 경로 설정 시 우선순위를 고려해야 한다.