Django的urlpatterns未捕获命名路由

0 投票
1 回答
561 浏览
提问于 2025-04-18 17:07

我在项目的设置中有这些:

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^login/', include('myapp.urls')),
    url(r'^$', include('myapp.urls'))
)

在应用的设置中有这些:

urlpatterns = patterns('',
    url(r'^login/', views.login, name = 'login'),
    url(r'^$', views.home, name = 'home')
)

访问 http://example.com 是正常的,可以调用到 views.home 这个函数/视图,但如果我去 http://example.com/login,却还是调用了 views.home,而不是我期待的 views.login。我知道我的正则表达式 r'^login/' 是可以匹配 /login 这个网址的模式——我到底哪里出错了呢?这让我很抓狂,因为这看起来很简单。我在其他语言和框架中有很多关于网址路由和MVC的经验,但对Django还算是新手。

有一个线索是,当我访问 http://example.com/login/login(这个模式出现了两次)时,能正确调用到 views.login 的路由……

1 个回答

2

你的网址设置得有点乱。你在网址中同时包含了“首页”的模式,这些模式适用于以“login/”开头的地址,以及所有从这个路由开始的地址。所以,如果一个网址是以“login/”开头的,它会把这个前缀去掉,然后开始匹配首页的模式。而当它到达那里时,剩下的就是一个空字符串,所以就会匹配到空网址的模式。

你应该修改项目的网址设置,完全去掉第一个“login”的模式,并且把匹配所有网址的模式中的“$”符号去掉(这样你就可以匹配所有的前缀,而不是空字符串)。

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('myapp.urls'))
)

撰写回答