django警告url.W005 URL名称空间不是唯一的

时间:2018-11-25 23:23:41

标签: python django django-urls

我无法理解以下警告。我有一个名为“ v1”的名称空间,我正在使用这些名称空间来确定API中的版本控制(使用django rest框架)。所以,我有这样的路径:

/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'),
]

listings / urls.py

app_name = 'listings'

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

一切正常。所有的URL被调度。版本控制有效。但是,我不断收到以下错误:

  

?:(urls.W005)URL名称空间“ v1”不是唯一的。您可能无法撤消此命名空间中的所有URL

我知道这是一个警告,我也许可以抑制它;但是,我想了解为什么会这样。根据我的URLconf和此警告,似乎不能有多个命名空间路径作为“同级”。它们必须是一个命名空间路径(例如“ v1”)的子代。如果我的理解正确,那么应该如何创建此URL配置。

1 个答案:

答案 0 :(得分:1)

基本上发生的是,命名空间在reverse查找URL方面起着重要作用。例如:

在您的示例中,reverse('v1:obtain_token')将返回/v1/accounts/token/。假设您在accountslistings中有两个具有相同名称的网址,那么您可能无法在反向查询中找到accounts网址。这就是为什么要发出警告的原因。如果对每个包含使用不同的名称空间,则更好。您的情况应该是:

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

有关详细信息,请阅读documentations

更新

您可以像这样进行版本控制:

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'),
...