我想验证最小长度为9的密码,并在AUTH_password_VALIDATORS中将其指定为:
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
},
我使用Django serializer序列化请求:
class UserSerializer(serializers.ModelSerializer):
date_joined = serializers.ReadOnlyField()
user_type = serializers.ListField(child=serializers.CharField(max_length = 20))
class Meta(object):
model = User
fields = ('id', 'email', 'first_name', 'middle_name', 'last_name', 'mobile_num', 'date_joined', 'password','user_type', 'otp_verified')
id = serializers.CharField(max_length=10)
email = serializers.EmailField()
password = serializers.CharField(style={'input_type': 'password'})
extra_kwargs = {'password': {'write_only': True}}
在这里,我想在BaseManager中检查密码验证,并相应地编码:
class UserManager(BaseUserManager):
def _create_user(self, email, password, **extra_fields):
if not email:
raise ValueError('The given email must be set')
try:
with transaction.atomic():
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
except:
raise
def create_user(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
if(len(password) < 9):
raise ValidationError("length too short")
else:
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_superuser', True)
return self._create_user(email, password=password, **extra_fields)
def get_default_password_validators(self, password):
return get_password_validators(settings.AUTH_PASSWORD_VALIDATORS)
now = datetime.datetime.now()
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=40, unique=True)
first_name = models.CharField(max_length=30, blank=True)
middle_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=now)
user_type = ArrayField(models.CharField(max_length = 20))
mobile_num = models.CharField(max_length = 10)
otp_verified = models.BooleanField(default=False)
objects = UserManager()
在create_user()中,我尝试检查密码的最小长度并进行相应的验证,也尝试使用类MinimumLengthValidator,但验证没有发生。因此使用自定义验证
有人能帮我用这个代码,默认的内置密码验证器吗
当您像这样创建用户序列化时,DRF将尝试准确地获取它从视图中获得的内容,并将其放入数据库中。您应该使用
import django.contrib.auth.password_validation
并在validate()
方法中执行它。与this question比较我得到了答案,在serializer类中添加以下内容:
密码验证
我没有选择BaseManager类,而是尝试了序列化程序本身的代码,它对我来说很好
相关问题 更多 >
编程相关推荐