1

我遇到了一个奇怪的问题,虽然我现在找到了解决方案,但我认为了解导致错误的原因会有所帮助。我在 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'),

)

由于视图接收的是用户名=用户名/更改密码而不是用户名=用户名,我收到一个错误 404 页面未找到

以这种方式解释 url 的原因是什么,为什么它在第一个实例中起作用?

4

1 回答 1

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>
于 2013-07-18T07:44:40.400 回答