如何防止用户名包含@/./+/-/_.?
How to prevent usernames from containing @/./+/-/_.?
我正在使用 django-allauth,出于某种原因,用户名默认允许:
"letters, digits and @/./+/-/_."
如何确保用户名严格由字母数字组成(没有 @/./+/-/_.
)?
我已经在使用这个 clean_username()
目前有效的验证器:
class UsernameMaxAdapter(DefaultAccountAdapter):
def clean_username(self, username):
exclude = ['@', '/', '.', '+', '-', '/', '_', ',']
if len(username) > 20:
raise ValidationError("Username can't be over 20 characters")
for i in exclude:
if i in username:
raise ValidationError("Use only alphanumeric characters")
return DefaultAccountAdapter.clean_username(self,username) # For other default validations.
编辑:刚意识到两个验证器都不起作用...现在正在尝试找出问题所在..
我没用过django
,当然不知道它的授权机制,但我知道,简单地说python
,如果你想执行这个,你可以简单地清理通过做输入:
newUserName = ''.join(ch for ch in oldUserName if ch.isalnum())
基本上,我遍历每个字符,如果字符是字母数字,我将它们附加到 'clean' 用户名。
在你的函数中,如果用户名不符合字母数字限制,执行上面的语句(放在if
下)。
您可以使用 regex 表达式来确保用户名仅包含允许的字符。对于字母数字字符,以下应该可以解决问题:
import re
def is_valid_username(username):
pattern = re.compile('([a-zA-Z]+|\d+)')
return ''.join(re.findall(pattern, username)) == username
这是一个输出示例:
username_list = ["WhatAGre4tUsern4me", "548ThatISAgoodUsername005",
"CheckOutMy_Username", "It'sAUsern@me"]
print([is_valid_username(u) for u in username_list])
>>> [True, True, False, False]
我认为 python 的内置函数 str.isalnum()
在这里很有用。
class UsernameMaxAdapter(DefaultAccountAdapter):
def clean_username(self, username):
# assumes "username" is a type of "str" object
<b>if not username.isalnum():
raise ValidationError("Use only alphanumeric characters")</b>
# your logic
UPDATE-1
在 settings.py 中设置 ACCOUNT_USERNAME_VALIDATORS
,如 documentation
中所述
class CustomValidator(object):
def __call__(self, username="", *args, **kwargs):
username = username.isalnum()
if not username:
raise ValidationError("Use only alphanumeric characters")
在你的 settings.py
、
custom_username_validators = [CustomValidator()]
ACCOUNT_USERNAME_VALIDATORS = 'path.to.settings.custom_username_validators'
我正在使用 django-allauth,出于某种原因,用户名默认允许:
"letters, digits and @/./+/-/_."
如何确保用户名严格由字母数字组成(没有 @/./+/-/_.
)?
我已经在使用这个 clean_username()
目前有效的验证器:
class UsernameMaxAdapter(DefaultAccountAdapter):
def clean_username(self, username):
exclude = ['@', '/', '.', '+', '-', '/', '_', ',']
if len(username) > 20:
raise ValidationError("Username can't be over 20 characters")
for i in exclude:
if i in username:
raise ValidationError("Use only alphanumeric characters")
return DefaultAccountAdapter.clean_username(self,username) # For other default validations.
编辑:刚意识到两个验证器都不起作用...现在正在尝试找出问题所在..
我没用过django
,当然不知道它的授权机制,但我知道,简单地说python
,如果你想执行这个,你可以简单地清理通过做输入:
newUserName = ''.join(ch for ch in oldUserName if ch.isalnum())
基本上,我遍历每个字符,如果字符是字母数字,我将它们附加到 'clean' 用户名。
在你的函数中,如果用户名不符合字母数字限制,执行上面的语句(放在if
下)。
您可以使用 regex 表达式来确保用户名仅包含允许的字符。对于字母数字字符,以下应该可以解决问题:
import re
def is_valid_username(username):
pattern = re.compile('([a-zA-Z]+|\d+)')
return ''.join(re.findall(pattern, username)) == username
这是一个输出示例:
username_list = ["WhatAGre4tUsern4me", "548ThatISAgoodUsername005",
"CheckOutMy_Username", "It'sAUsern@me"]
print([is_valid_username(u) for u in username_list])
>>> [True, True, False, False]
我认为 python 的内置函数 str.isalnum()
在这里很有用。
class UsernameMaxAdapter(DefaultAccountAdapter):
def clean_username(self, username):
# assumes "username" is a type of "str" object
<b>if not username.isalnum():
raise ValidationError("Use only alphanumeric characters")</b>
# your logic
UPDATE-1
在 settings.py 中设置 ACCOUNT_USERNAME_VALIDATORS
,如 documentation
class CustomValidator(object):
def __call__(self, username="", *args, **kwargs):
username = username.isalnum()
if not username:
raise ValidationError("Use only alphanumeric characters")
在你的 settings.py
、
custom_username_validators = [CustomValidator()]
ACCOUNT_USERNAME_VALIDATORS = 'path.to.settings.custom_username_validators'