我正在使用django-allauth,由于某种原因,用户名默认值允许:
“字母,数字和@ /。/ + /-/ _。”
如何确保用户名严格为字母数字(没有@/./+/-/_.
)?
我已经在使用目前可以使用的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.
编辑:刚刚意识到两个验证器都不起作用...正在尝试查找问题。
答案 0 :(得分:1)
我没有使用过django
,当然也不知道它的授权机制,但是我知道在简单的python
中,如果您想执行此操作,则可以通过在做:
newUserName = ''.join(ch for ch in oldUserName if ch.isalnum())
本质上,如果字符是字母数字字符,我将遍历每个字符并将其附加到“干净”用户名上。
在您的函数中,如果用户名不符合字母数字限制,请执行上面的语句(将其放在if
下)。
答案 1 :(得分:1)
您可以使用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]
答案 2 :(得分:1)
我认为python的内置函数str.isalnum()
在这里可能有用。
class UsernameMaxAdapter(DefaultAccountAdapter):
def clean_username(self, username):
# assumes "username" is a type of "str" object
if not username.isalnum():
raise ValidationError("Use only alphanumeric characters")
# your logic
UPDATE-1
如documentation
ACCOUNT_USERNAME_VALIDATORS
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'