Django REST url与模式不匹配

时间:2017-03-22 17:13:55

标签: python django django-rest-framework

我想在主urls.py文件中保留URL的前缀和应用名称。这样我就可以避免同一项目下其他应用程序中端点的冲突。

# project/urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/v1/accounts/', include('account.urls')),
    url(r'^api/v1/users/', include('users.urls')),
    url(r'^api/v1/transactions/', include('transactions.urls')),
    url(r'^auth-token-auth', views.obtain_auth_token),
]

例如,我将accounts.urls包含以下内容:

urlpatterns = [
     url(r'^', AccountListView.as_view()),
     url(r'^(?P<pk>[0-9]+)/$', AccountDetailView.as_view()),
]

通过这种方式,/api/v1/accounts/1模式与AccountDetailView不匹配。它始终返回第一个视图AccountListView

最有趣的是我以下面提供的方式更改urlpatterns定义。所有端点都按预期工作。

# project/urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/v1/', include('account.urls')),
    url(r'^api/v1/', include('users.urls')),
    url(r'^api/v1/', include('transactions.urls')),
    url(r'^auth-token-auth', views.obtain_auth_token),
]

# account/urls.py
urlpatterns = [
     url(r'^accounts/$', AccountListView.as_view()),
     url(r'^accounts/(?P<pk>[0-9]+)/$', AccountDetailView.as_view()),
]

问题是如何通过在主urls.py中保留应用名称api/v1/[app_name]来解决此问题。也许您可以为URL映射建议其他模式(最佳实践)。

1 个答案:

答案 0 :(得分:1)

您的第二个版本的网址正确终止了帐户列表模式,但您的第一个版本没有。

url(r'^$', AccountListView.as_view()),