python - django 警告 urls.W005 URL 命名空间不唯一

标签 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'))
]

账户/urls.py

app_name = 'accounts'

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

列表/urls.py

app_name = 'listings'

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

一切都按预期进行。所有网址均已发送。版本控制有效。但是,我不断收到以下错误:

?: (urls.W005) URL namespace 'v1' isn't unique. You may not be able to reverse all URLs in this namespace

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

最佳答案

基本上发生的情况是,命名空间在 reverse 上发挥着重要作用。找到网址。例如:

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

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

关于python - django 警告 urls.W005 URL 命名空间不唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53473027/

相关文章:

python - 我的非数字列在重新采样时被删除

Django + Celery + Apache mod_wsgi + Postgres + RabbitMQ 多个客户端的应用程序

python - 按 'datetime' 对列表进行排序

Django 从 View 生成 URL

python - 带参数的 get_absolute_url

python - google.auth.exceptions.DefaultCredentialsError :

python - 如何拾取元素中的某个平面来镜像它?

python - 用 OR 代替 Sum 的二进制矩阵乘法

css - 编辑 django 管理 css 文件不加载更改

django - {% url %} 给了我 NoReverseMatch 错误,而 reverse() 返回 url 就好了。为什么?