【问题标题】:Django route all non-catched urls to included urls.pyDjango 将所有未捕获的 url 路由到包含的 urls.py
【发布时间】:2015-07-06 14:12:57
【问题描述】:

我希望每个不以 'api' 开头的 url 都使用 foo/urls.py

urls.py

from django.conf.urls import include, url
from foo import urls as foo_urls

urlpatterns = [
url(r'^api/', include('api.urls', namespace='api')),
url(r'^.*/$', include(foo_urls)),
]    

foo/urls.py

from django.conf.urls import include, url
from foo import views

urlpatterns = [
url(r'a$', views.a),
]    

这不起作用,有什么想法吗?

【问题讨论】:

  • 不起作用是什么意思?您正在测试什么 URL,结果如何?

标签: python django url-routing


【解决方案1】:

如果您想要一个捕获所有 url 模式,请使用:

url(r'^', include(foo_urls)),

来自the docs

每当 Django 遇到 include() 时,它都会切断与该点匹配的 URL 的任何部分,并将剩余的字符串发送到包含的 URLconf 以进行进一步处理。

在您当前的代码中,正则表达式^.*/$ 匹配整个网址/a/。这意味着没有任何东西可以传递给foo_urls

【讨论】:

  • 你不需要^ 你可以直接url('', include(foo_urls)),
  • @Boris 是的,url(r'^', include(...))url('', include(...)) 在这种情况下的行为相同,但总的来说,^ 确实有所作为。例如 url('blog/', include(...)) 将匹配 weblog/url(r'^blog/', include(...)) 不会。如果您使用url()re_path,那么我建议使用r'^' 以保持一致性。最简单的解决方案可能是切换到path() 并使用path('', include(...))
【解决方案2】:

这样做:

urlpatterns = [
url(r'^api/', include('api.urls', namespace='api')),
url(r'^', include(foo_urls)),
]  

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2019-05-13
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多