Tex*_*xas 8 python passwords django validation registration
如上所述,我将尝试在注册过程中使用某个额外规则来验证密码.如果密码至少有一个数字,一个字母和一个特殊字符,则额外规则应该是密码验证.
我解决这个问题的方法我创建了一个名为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.'))
Run Code Online (Sandbox Code Playgroud)
我的自定义注册表单如下所示:
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', )
Run Code Online (Sandbox Code Playgroud)
我不知道如何告诉django,我的自定义密码验证器应该在django AUTH_PASSWORD_VALIDATORS旁边使用.
Tex*_*xas 16
因此,正如e4c5所提到的,它非常简单明了.
我的CustomPasswortValidator看起来像这样:
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 ""
Run Code Online (Sandbox Code Playgroud)
只需将它添加到settings.py中的AUTH_PASSWORD_VALIDATORS列表即可!
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',
},]
Run Code Online (Sandbox Code Playgroud)