Django Rest Framework:包括默认路由器时,其他URL被覆盖

时间:2019-06-17 15:24:51

标签: python django django-rest-framework

我的目录如下

manage.py
base_app/
    urls.py
    settings.py
    etc...
app1/
    urls.py
    models.py
    etc...

当我在app1/urls.py中包含base_app时,我的API路由似乎被覆盖。例如,在base_app/urls.py中,如果我具有以下内容:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
    url(r'^schema/$', schema_view),
]

然后,我的架构列出了所有的rest-auth API端点。但是,当我包含app1

中的API端点时
urlpatterns = [
    url(r'^', include('app1.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
    url(r'^schema/$', schema_view),
]

然后我失去了rest-auth的端点,而只得到了app1的端点。我认为问题出在我如何设置app1的{​​{1}}还是我如何在urls.py中错误地使用命名空间。

base_app/urls.py显示如下(不包括导入):

app1/urls.py

如何正确区分router = DefaultRouter() router.register(r'app1', views.App1ViewSet, base_name="app1") urlpatterns = router.urls rest-auth的API之间的命名空间?

1 个答案:

答案 0 :(得分:0)

您已经通过将所有URL放在首位并匹配MEMBER [Measures].[N Tiendas AA 2] AS ( PARALLELPERIOD( [Tiempo].[Periodos].[Ano] , 1 , STRTOMEMBER( @pPrevAno, CONSTRAINED ) ),[Measures].[N Tiendas] ) (匹配字符串的开头,实际上是任何字符串)来将所有URL解析为app1.urls

最后移动您的^ URL,使其成为一个包罗万象的

app1

一个更好的解决方案是将起始URL放在根URL模式中,这样,当您有多个应用程序时,所有应用程序都根据起始URL命名所有的URL:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
    url(r'^schema/$', schema_view),
    url(r'^', include('app1.urls')),
]

然后,您可以在urlpatterns = [ url(r'^app1/', include('app1.urls')), ... ... ] 网址定义中省略起始部分,即在app1之后使用该部分,例如:

/app1/

FWIW,在受支持的版本上,您应该使用router.register(r'foobar/$', views.App1FooBar) # resolves to `/app1/foobar/` 来匹配URL,而不是正则表达式匹配(path FWIW仍然支持)。