본문 바로가기

Python/Django

[Error Solved][Django url] django 프로젝트 앱에 <str:category> url을 추가했을 때 모든 url이 해당 url로 라우팅 되는 문제

문제 발생

# video/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.video_list, name='video_list'),
    path('<category>/', views.video_category, name='video_category'), # url 추가
    path('<int:pk>/', views.video_detail, name='video_detail'),
    path('new/', views.video_new, name='video_new'),
    path('<int:pk>/delete', views.video_delete, name='video_delete'),
    path('signup/', views.signup, name='user_signup'),
    path('login/', views.signin, name='user_login'),
    path('logout/', views.signout, name='user_logout'),
    path('like/', views.video_like, name='video_like'),
    path('myVideo/', views.my_video, name='my_video'),
    path('likeVideo/', views.like_video, name='like_video'),
]

category string을 받길 원했는데, 이렇게 되니 모든 url이 추가된 url로 라우팅되는 문제가 발생했다.

 

문제 해결 과정

그래서, string이라는걸 명시해주지 않아서 그런가해서 해봤는데,

path('<str:category>/', views.video_category, name='video_category'), # str: 추가

같은 문제가 발생하였고,

template에서 url name을 잘못 사용했나 싶어 확인했는데 아니었고,

결국, url pattern을 매칭하는데 있어 video_category가 위에 있어서 가장 먼저 매칭되는 것이라는 결론밖엔 나오지 않았다.

 

그래서 video_category url을 맨 아래에 위치시켰더니 의도한대로 작동하기 시작하였다.

from django.urls import path
from . import views

urlpatterns = [
    path('', views.video_list, name='video_list'),
    path('<int:pk>/', views.video_detail, name='video_detail'),
    path('new/', views.video_new, name='video_new'),
    path('<int:pk>/delete', views.video_delete, name='video_delete'),
    path('signup/', views.signup, name='user_signup'),
    path('login/', views.signin, name='user_login'),
    path('logout/', views.signout, name='user_logout'),
    path('like/', views.video_like, name='video_like'),
    path('myVideo/', views.my_video, name='my_video'),
    path('likeVideo/', views.like_video, name='like_video'),
    path('<str:category>/', views.video_category, name='video_category'), # I'm here!
]

결론

url name의 개념에 대해 잘못 알고 있었단 사실을 알게 되었다.

template에서 매칭되는 url name으로 바로 라우팅되는 것으로 알고 있었는데,

pattern 매칭을 먼저 확인한다는 것을 알 수 있었다.

더 나은 방법으로 url을 정의하고, 사용하는 방법에 대해 알아봐야겠다!