djang中url的排序

2024-04-20 01:08:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个奇怪的问题,虽然我现在已经找到了一个解决方案,但我认为了解是什么导致了错误是有帮助的。我在Django项目中有一个应用程序,URL如下所示:

  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'),
)

当我指向浏览器更改密码时,一切正常。但是,我的URL排序如下:

    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=username/changepassword而不是username=username,因此我得到了一个404页未找到的错误

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


Tags: nameviewurlas错误usernamepasswordchange
1条回答
网友
1楼 · 发布于 2024-04-20 01:08:59

丹·克拉森的评论就是答案。只需详细说明一下,您可以通过测试regexp轻松发现:

>>> 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>

相关问题 更多 >