Django的urlpatterns未捕获命名路由
我在项目的设置中有这些:
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'))
)