Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django auth密码验证器旁边使用自定义密码验证器?_Python_Django_Validation_Passwords_Registration - Fatal编程技术网

Python 如何在django auth密码验证器旁边使用自定义密码验证器?

Python 如何在django auth密码验证器旁边使用自定义密码验证器?,python,django,validation,passwords,registration,Python,Django,Validation,Passwords,Registration,正如上面提到的问题,我将尝试在注册过程中使用特定的额外规则来验证密码。 额外的规则应该是,如果密码至少有一个数字、一个字母和一个特殊字符,则该密码是有效的 我解决这个问题的方法是创建一个名为validators.py的文件 from django.core.exceptions import ValidationError class CustomPasswortValidator: def validate(value): # check for digit

正如上面提到的问题,我将尝试在注册过程中使用特定的额外规则来验证密码。 额外的规则应该是,如果密码至少有一个数字、一个字母和一个特殊字符,则该密码是有效的

我解决这个问题的方法是创建一个名为validators.py的文件

from django.core.exceptions import ValidationError

class CustomPasswortValidator:

    def validate(value):

      # check for digit
      if not any(char.isdigit() for char in value):
          raise ValidationError(_('Password must contain at least 1 digit.'))

      # check for letter
      if not any(char.isalpha() for char in value):
          raise ValidationError(_('Password must contain at least 1 letter.'))

      # check for special character
      special_characters = "[~\!@#\$%\^&\*\(\)_\+{}\":;'\[\]]"
      if not any(char in special_characters for char in value):
        raise ValidationError(_('Password must contain at least 1 letter.'))
我的自定义注册表如下所示:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User


class RegistrationForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False,                                         
                                 help_text='Optional.')
    last_name = forms.CharField(max_length=30, required=False, 
                                 help_text='Optional.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _

class CustomPasswordValidator():

    def __init__(self, min_length=1):
        self.min_length = min_length

    def validate(self, password, user=None):
        special_characters = "[~\!@#\$%\^&\*\(\)_\+{}\":;'\[\]]"
        if not any(char.isdigit() for char in password):
            raise ValidationError(_('Password must contain at least %(min_length)d digit.') % {'min_length': self.min_length})
        if not any(char.isalpha() for char in password):
            raise ValidationError(_('Password must contain at least %(min_length)d letter.') % {'min_length': self.min_length})
        if not any(char in special_characters for char in password):
            raise ValidationError(_('Password must contain at least %(min_length)d special character.') % {'min_length': self.min_length})

    def get_help_text(self):
        return ""

我不明白我是如何告诉django的,我的自定义密码验证器应该与django AUTH_password_验证器一起使用。

因此,正如e4c5所提到的,它非常简单和直接

我的CustomPasswordValidator如下所示:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User


class RegistrationForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False,                                         
                                 help_text='Optional.')
    last_name = forms.CharField(max_length=30, required=False, 
                                 help_text='Optional.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _

class CustomPasswordValidator():

    def __init__(self, min_length=1):
        self.min_length = min_length

    def validate(self, password, user=None):
        special_characters = "[~\!@#\$%\^&\*\(\)_\+{}\":;'\[\]]"
        if not any(char.isdigit() for char in password):
            raise ValidationError(_('Password must contain at least %(min_length)d digit.') % {'min_length': self.min_length})
        if not any(char.isalpha() for char in password):
            raise ValidationError(_('Password must contain at least %(min_length)d letter.') % {'min_length': self.min_length})
        if not any(char in special_characters for char in password):
            raise ValidationError(_('Password must contain at least %(min_length)d special character.') % {'min_length': self.min_length})

    def get_help_text(self):
        return ""
只需将其添加到settings.py中的AUTH_PASSWORD_验证器列表中,即可

AUTH_PASSWORD_VALIDATORS = [
{
    'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
{   'NAME': 'registration.validators.CustomPasswordValidator',

},]

你的问题不清楚。您想使用自定义密码验证器,但不想更改settings.py中的
AUTH\u password\u验证器
?是吗?对,我不想更改验证密码验证器。我想创建我自己的密码,并将其添加到其他密码的旁边。该语句不能清除“p”的内容,只需将其添加到其他密码的旁边。如果您查看身份验证密码验证器,它是一个列表。你可以自由添加你自己的验证器什么?好吧,我可能不明白。在settings.py中引用了某些验证器。如何添加额外的规则来验证密码?好的,我在上面的文件中是这样做的吗?你可以接受你自己的答案,你可能应该:-)@e4c5:如果我们至少需要一个数字、一个字符和一个特殊字符,
minu_length
不应该是
3