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

时间:2018-08-06 09:46:54

标签: python django django-allauth

我正在使用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.

编辑:刚刚意识到两个验证器都不起作用...正在尝试查找问题。

3 个答案:

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

所述,在settings.py中设置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'