django warning urls.W005 Пространство имен URL не является уникальным - PullRequest
0 голосов
/ 26 ноября 2018

У меня проблемы с пониманием следующего предупреждения.У меня есть пространство имен с именем "v1", и я использую эти пространства имен для определения версий в моем API (используя django rest framework).Итак, у меня есть следующие пути:

/v1/accounts/me
/v1/listings

Вот конфигурация URL-адресов (project / urls.py):

urlpatterns = [
    path('admin/', admin.site.urls),
    path('v1/accounts/', include('accounts.urls', namespace='v1')),
    path('v1/listings/', include('listings.urls', namespace='v1'))
]

accounts / urls.py

app_name = 'accounts'

urlpatterns = [
    url(r'^token/$', views.obtain_auth_token, name='obtain_token'),
    url(r'^me/$', my_account, name='my_account'),
]

lists / urls.py

app_name = 'listings'

urlpatterns = [
    path('', recent_listings, name='recent_listings')
]

Все работает как положено.Все URL отправлены.Версионность работает.Тем не менее, я получаю следующую ошибку:

?: (urls.W005) Пространство имен URL 'v1' не уникально.Возможно, вы не сможете отменить все URL-адреса в этом пространстве имен

Я знаю, что это предупреждение, и я мог бы его подавить;Однако я хочу понять, почему это происходит.Основываясь на моем URLconf и этом предупреждении, кажется, что не может быть нескольких путей в пространстве имен как «братьев и сестер».Они должны быть потомками одного пути в пространстве имен (например, "v1").Если мое понимание верно, как я должен создать эту конфигурацию URL.

1 Ответ

0 голосов
/ 26 ноября 2018

В основном получается, что пространство имен играет важную роль при обратном поиске URL.Например:

В вашем примере reverse('v1:obtain_token') вернет /v1/accounts/token/.Допустим, у вас есть два URL с одинаковыми именами в accounts и listings, тогда вы не сможете найти accounts url в обратном запросе.Вот почему предупреждение для.Лучше, если вы используете разные пространства имен для каждого включения.В вашем случае это должно быть:

path('v1/accounts/', include('accounts.urls', namespace='accounts')),
path('v1/listings/', include('listings.urls', namespace='listings'))

Пожалуйста, прочитайте документацию для получения более подробной информации.

Обновление

вы можете сделать версионирование какэто:

path('accounts/', include('accounts.urls', namespace='accounts')),  # accounts url 

внутри аккаунта приложение:

path('v1/token/', views.obtain_auth_token, name='obtain_token_v1'),
path('v2/token/', views.obtain_auth_token2, name='obtain_token_v2'),
...
...