在django订购网址

时间:2013-07-18 02:30:36

标签: python django

我遇到了一个奇怪的问题,虽然我现在找到了一个解决方案,但我认为了解造成错误的原因会很有帮助。我在Django项目中有一个应用程序,网址如下:

  urlpatterns = patterns('',
    url(r'^$', UserProfileListView.as_view(),
        name='userprofile_list'),
    url(r'^(?P<username>[\w.@+-_]+)/changepassword/$',
        password_change, name='change_password'),
    url(r'^(?P<username>[\w.@+-_]+)/$',
        profile_detail,
        name='userprofile_detail'),
)

当我将浏览器指向change_password时,一切正常。但是我订购的网址如下:

    urlpatterns = patterns('',
url(r'^$', UserProfileListView.as_view(),
    name='userprofile_list'),
url(r'^(?P<username>[\w.@+-_]+)/$',
    profile_detail,
    name='userprofile_detail'),
url(r'^(?P<username>[\w.@+-_]+)/changepassword/$',
    password_change, name='change_password'),

)

由于视图收到的用户名= username / changepassword而不是username = username

,我收到错误404页面未找到

以这种方式解释网址的原因是什么?为什么它会在第一时间工作?

1 个答案:

答案 0 :(得分:2)

Dan Klasson的评论就是答案。只是详细说明一下,你可以通过测试你的正则表达式轻松找到它:

>>> import re
>>> re.match(r"^(?P<username>[\w.@+-_]+)/$", "foobar/changepassword/")
<_sre.SRE_Match object at 0x7f949c54be40>

FWIW问题出在\w说明符上,可能与您的预期无关:

>>> re.match(r"\w", "foobar/changepassword/")
<_sre.SRE_Match object at 0x7f949c5a1d30>