Próbuję zintegrować django validators 1.9 z serializerami frameworku django rest. Ale zserializowany "użytkownik" (struktury django rest) nie jest zgodny z walidatorami django.integracja weryfikatorów haseł django z frameworkiem django validate_password
Oto 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
udało mi się dostać MinimumLengthValidator i NumericPasswordValidator prawidłowe, ponieważ zarówno validate funkcja nie używać „użytkownik” w walidacji. Kod źródłowy jest here
Fragment kodu źródłowego Django:
def validate(self, password, user=None):
if password.isdigit():
raise ValidationError(
_("This password is entirely numeric."),
code='password_entirely_numeric',
)
Dla innych walidatorami jak UserAttributeSimilarityValidator, funkcja używa innego jeden argument 'user' w walidacji ('user' jest Django modelu użytkownika, jeśli I” m nie źle)
Fragment kodu źródłowego Django:
def validate(self, password, user=None):
if not user:
return
for attribute_name in self.user_attributes:
value = getattr(user, attribute_name, None)
Jak mogę zmienić serializ ed użytkownika do tego, co django walidatorami (UserAttributeSimilarityValidator) można zobaczyć
Wyciąg z kodu źródłowego 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
Edycja
Django Reszta Framework można uzyskać wszystkie Django wbudowanego sprawdzanie poprawności hasła (ale to jak hack). Oto problem:
validationError jest tak
[ValidationError ([ 'To hasło jest zbyt krótkie, musi zawierać co najmniej 8 znaków..']), ValidationError ([ 'To hasło jest całkowicie numeryczna. '])]
Walidacja nie zawiera pola. Django reszta ramy zobaczyć go jako
{
"non_field_errors": [
"This password is too short. It must contain at least 8 characters.",
"This password is entirely numeric."
]
}
Jak mogę wstrzyknąć pole na raise ValidationError
Istnieje kilka literówka w kodzie. Nawiasem mówiąc, twoje rozwiązanie działa poprawnie podczas sprawdzania poprawności, ale struktura django rest nie może uzyskać nazwy pola stąd non_field_errors ---> { "non_field_errors": [ "Hasło jest zbyt podobne do wiadomości e-mail.", " To hasło jest za krótkie i musi zawierać co najmniej 8 znaków. " ] } – momokjaaaaa
} Tak naprawdę nie przetestowałem kodu, więc może być tu kilka literówek, ale to nie powinno powstrzymać cię od prawidłowego używania i testowania tego kodu. O "NON_FIELD_ERRORS" Zaktualizowałem swoją odpowiedź, a teraz podniesione błędy powinny zawierać nazwę pola 'password' jako klucz dla tych błędów. – AKS
Należy pamiętać, że '** data' może nie zawierać wszystkich wymaganych pól do utworzenia obiektu użytkownika podczas wykonywania aktualizacji częściowych (' PATCH'). – faph