如何防止用户名包含@/./+/-/_.?

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'