Django:用户名的urlpattern?

时间:2015-09-04 09:52:12

标签: python regex django django-urls

到目前为止,队友已将此代码用于用户名的网址格式:

# urls.py
urlpatterns = patterns('...',
   url(r'^user/(?P<username>[.-_\w]+)/foo', 'myapp.views.foo'),
   ....

存在隐藏的错误:如果用户名包含-,则撤消将失败,因为正则表达式模式[.-_的开头意味着&#34;所有字符从._&#34;

可以使用哪种模式来匹配所有有效用户名?

PS:如果你想匹配django中所有可能的用户名,我想将-符号添加到正则表达式是不够的。

5 个答案:

答案 0 :(得分:8)

根据我在AbstractUser模型中看到的内容,我认为用于获取用户名的更好的正则表达式是(?P<username>[\w.@+-]+)

答案 1 :(得分:5)

我认为您不应该在网址格式中添加任何用户名验证。将验证放在一个地方 - 首次创建帐户的地方。

匹配用户提供的任何内容,并将其传递给安全数据库函数以查找用户名,如果不存在则失败。

因此,在您的网址模式中,让浏览器发送任何非空的内容,并依靠您非常智能的数据库告诉您之前认为有效的内容。

url(r'^user/(?P<username>.+)/foo$', 'myapp.views.foo'),

另外,请注意最后的“$”。

答案 2 :(得分:4)

您可以将连字符移动到字符类的开头

[-.\w]

或者你可以用反斜杠

来逃避它
[.\-\w]

注意我删除了下划线,因为它包含在\w中。我还假设您只想接受.-\w,并且您不希望接受.到{{1}的所有字符}。该范围包含_等字符,因此您可能需要检查所有用户名是否与新的正则表达式匹配。

答案 3 :(得分:4)

您可以使用以下方式:

[-.\w](最左边使用-

[.\-\w]-在任何地方使用反斜杠)

[.\w-]-最右边使用)

如果您在任何特殊字符(在正则表达式特殊字符中使用)之前使用特殊字符,则最佳使用 \(反斜杠)。

为了最好地使用,您的正则表达式将为^user/(?P<username>[.\-_\w]+)/foo

答案 4 :(得分:0)

首先,它不是错误,而是功能well documented in the docs

  

<强> []

     

用于表示一组字符。在一组:

     

字符范围可以通过给出两个字符并用' - '分隔来表示,例如[az]将匹配任何小写的ASCII字母,[0-5] [0-9]将匹配所有两个字符 - 数字从00到59,[0-9A-Fa-f]将匹配任何十六进制数字。 如果 - 被转义(例如[a-z])或者如果它被放置为第一个或最后一个字符(例如[a-]),它将匹配文字“ - ”

因此,在两个文字之间使用-会将该正则表达式评估为字符范围:

re.compile("[a-0]+")
>> error: bad character range
re.findall("[.-_]+", "asdasd-asdasdad._?asdasd-")
>> ['._?']

如您所见,当在字符集中的字符之间使用时,python将始终将-作为范围指示符插入。

正如文档(也)在文档中所述,避免范围声明是通过使用-转义\-或将其作为字符集中{{1}的第一个或最后一个文字来完成的。 1}}

如果要捕获包含[]的字符范围,请尝试:

-

注意:当未设置LOCALE和UNICODE标志时, re.findall("[.-_\-]+", "asdasd-asdasdad._?asdasd-") >> ['-', '._?', '-'] 等于\w。因此,您无需再次声明[a-zA-Z0-9_]

在你的情况下:

_

除了url(r'^user/(?P<username>[-.\w]+)/foo', 'myapp.views.foo') url(r'^user/(?P<username>[.\w-]+)/foo', 'myapp.views.foo') url(r'^user/(?P<username>[.\-\w]+)/foo', 'myapp.views.foo') 用法之外,如果您使用的是默认的Django用户名样式,那么@ navneet35371对于有效的字符集是正确的。您可以更改正则表达式字符集以包含-@并使用

+