我将尝试将 django validators 1.9 与 Django Rest Framework 序列化器集成。但是,序列化的“用户”(来自 Django Rest Framework)与 Django 验证器不兼容。
以下是 serializers.py 文件。
对于像UserAttributeSimilarityValidator这样的其他验证器,该函数在验证过程中使用另一个参数'user'(如果我没记错,'user'是Django用户模型)。
来自Django源代码的摘录:
如何在
以下是 serializers.py 文件。
import django.contrib.auth.password_validation as validators
from rest_framework import serializers
class RegisterUserSerializer(serializers.ModelSerializer):
password = serializers.CharField(style={'input_type': 'password'}, write_only=True)
class Meta:
model = User
fields = ('id', 'username', 'email, 'password')
def validate_password(self, data):
validators.validate_password(password=data, user=User)
return data
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
user.is_active = False
user.save()
return user
我已经成功实现了MinimumLengthValidator和NumericPasswordValidator,因为这两个函数在验证时都没有使用'user'。源代码在这里。
Django源代码摘录:
def validate(self, password, user=None):
if password.isdigit():
raise ValidationError(
_("This password is entirely numeric."),
code='password_entirely_numeric',
)
对于像UserAttributeSimilarityValidator这样的其他验证器,该函数在验证过程中使用另一个参数'user'(如果我没记错,'user'是Django用户模型)。
来自Django源代码的摘录:
def validate(self, password, user=None):
if not user:
return
for attribute_name in self.user_attributes:
value = getattr(user, attribute_name, None)
如何将序列化的用户转换为django验证器(UserAttributeSimilarityValidator)所能识别的形式
Django源代码摘录:
def validate(self, password, user=None):
if not user:
return
for attribute_name in self.user_attributes:
value = getattr(user, attribute_name, None)
if not value or not isinstance(value, string_types):
continue
编辑
Django Rest Framework可以获取Django内置的所有密码验证功能(但这有点像一个hack)。这里有一个问题:
validationError的格式如下:
[ValidationError(['此密码太短。它必须至少包含8个字符。' ),ValidationError( ['此密码完全是数字。'])]
验证不包含字段。 Django Rest Framework将其视为
{
"non_field_errors": [
"This password is too short. It must contain at least 8 characters.",
"This password is entirely numeric."
]
}
如何在
raise ValidationError
处注入一个字段
password
字段名称作为这些错误的键。 - AKSPATCH
)更新时,**data
可能不包含创建用户对象所需的所有字段。请翻译完整句子,并保持原意,同时以通俗易懂的方式表达,但不要添加任何额外信息。 - faphuser=User
)。但是在哪里记录了在validate
中使用raise serializers.ValidationError
会导致400 Bad Request响应?目前,django_rest_framework
对我来说有点神秘,因为我找不到这种行为的文档。任何建议都将不胜感激。我想更好地理解它。 - M3RS