Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架:包括默认路由器时覆盖的其他URL_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django Rest框架:包括默认路由器时覆盖的其他URL

Python Django Rest框架:包括默认路由器时覆盖的其他URL,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个目录如下 manage.py base_app/ urls.py settings.py etc... app1/ urls.py models.py etc... 当我在base\u应用程序中包含app1/url.py时,我的API路由似乎被覆盖。例如,在base\u app/url.py中,如果我有以下内容: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r

我有一个目录如下

manage.py
base_app/
    urls.py
    settings.py
    etc...
app1/
    urls.py
    models.py
    etc...
当我在
base\u应用程序中包含
app1/url.py
时,我的API路由似乎被覆盖。例如,在
base\u app/url.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验证API端点。然而,当我从
app1

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
urls.py
,要么在于我如何在
base\u app/urls.py
中错误地使用名称空间

app1/url.py
显示如下(不包括导入):


如何在
rest auth
app1
的API之间正确地分离名称空间?

您已经将所有URL解析为
app1.url
,方法是将其放在第一位并匹配
^
(匹配字符串的开头,基本上是任何字符串)

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

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

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

router.register(r'foobar/$', views.App1FooBar)  # resolves to `/app1/foobar/`


FWIW,在受支持的版本上,您应该使用
path
来匹配URL,而不是正则表达式匹配(仍然由
path\u re
FWIW支持)。

您已经将所有URL解析为
app1.URL
,方法是将其放在第一位并匹配
^
(匹配字符串的开头,基本上是任何字符串)

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

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

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

router.register(r'foobar/$', views.App1FooBar)  # resolves to `/app1/foobar/`


FWIW,在受支持的版本上,您应该使用
path
来匹配URL,而不是正则表达式匹配(仍然由
path\u re
FWIW支持).

我同意你的第一个评论,但建议的解决方案不起作用。我也不认为这是可取的。如果我添加另一个类似于
app2
的应用程序,那么我将遇到同样的问题。@Nonamarando更新了答案。如果不起作用,请将完整的错误消息添加到你的问题中。很抱歉延迟。我将为你的答案打上a回答正确。结果是我的模式没有显示当时的所有路线。使用
coreapi
,我可以列出所有路线。我的第一条评论可能也不正确。我同意你的第一条评论,但建议的解决方案不起作用。我认为这也不可取。我应该添加另一个类似的应用程序吗e
app2
,然后我会遇到同样的问题。@Nonamarando更新了答案。如果它不起作用,请在你的问题中添加完整的错误消息。很抱歉延迟。我会将你的答案标记为正确。结果是我的模式当时没有显示所有路由。使用
coreapi
,我可以列出所有路由我的第一句话可能也不正确。