Я хочу использовать свой собственный PasswordResetSerializer для автоматической отправки электронного письма после того, как пользователь достигнет предела попыток входа в систему
Этот пользовательский сериализатор отлично работает в моем интерфейсе через вызов API, но я хочу использовать его в моем бэкэнде аутентификации (см. Authentication.py в последней строке)
Вот мой код:
authentication.py
class ExampleAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
username = request.data.get('email', None) # get the username request header
password = request.data.get('password', None)
"""
After all validations and login attempts
"""
if user.fails_authentication():
#Use here my custom PasswordResetSerializer
Вот мой пользовательский сериализатор
serializers.py
class PasswordResetSerializer(serializers.Serializer):
email = serializers.EmailField()
password_reset_form_class = PasswordResetForm
def validate_email(self, value):
self.reset_form = self.password_reset_form_class(data=self.initial_data)
if not self.reset_form.is_valid():
raise serializers.ValidationError(_('Error'))
###### FILTER YOUR USER MODEL ######
if not User.objects.filter(email=value).exists():
raise serializers.ValidationError(_('Invalid e-mail address'))
return value
def save(self):
request = self.context.get('request')
user = User.objects.get(email=request.data.get('email'))
token = Token.objects.get(user=user.id)
uid = urlsafe_base64_encode(force_bytes(user.id)).decode()
template = 'example_message.html'
context = {'usertoken': token, 'reactdomain': 'localhost:3000', 'userid': uid}
opts = {
'use_https': request.is_secure(),
'from_email': getattr(settings, 'DEFAULT_FROM_EMAIL'),
###### USE YOUR TEXT FILE ######
'email_template_name': template,
'extra_email_context': context,
'html_email_template_name': template,
'request': request,
}
self.reset_form.save(**opts)