Как создать систему повторной отправки проверочного кода в Django?
У меня есть проблема, которая заключается в том, что каждый раз, когда пользователь создает свой аккаунт и не вводит свой код (это означает, что код истек), пользователь не может получить код снова, потому что аккаунт может быть создан один раз. Я хочу знать, как я могу изменить этот код таким образом, чтобы пользователь мог получать проверочный код снова и снова. serilizer.py:
class RegisterationSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=True, help_text=_("Enter a valid password"))
repeated_password = serializers.CharField(write_only=True, required=True, help_text=_("Enter your password again"))
class Meta:
model = User
fields = ["email", "username", "name", "password", "repeated_password"]
extra_kwargs = {
'email': {'help_text': _("Enter your email")},
'username': {'help_text': _("Enter your username")},
'name': {'help_text': _("Enter your name"), 'required': False, 'allow_blank': True},
}
def validate(self, data):
print(User.objects.filter(email=data["email"], is_active=False))
if data["password"] and data["repeated_password"] and data["password"] != data["repeated_password"]:
raise serializers.ValidationError(_("Password and repeated password must be the same"))
if data["email"].strip() == data["username"].strip():
raise serializers.ValidationError(_("Email and username must be different"))
return data
class ConfirmCodeSerializer(serializers.ModelSerializer):
email = serializers.EmailField(write_only=True, max_length=220, min_length=6, help_text=_("Enter your email"))
class Meta:
model = VerficationCode
fields = ["email","code"]
extra_kwargs = {
'email': {'help_text': _("Enter your email")},
'code': {'help_text': _("Enter your code")},
}
views.py:
class RegisterationApiView(APIView):
"""
Get username, email, name, and password from the user
and save it in the database
"""
def post(self, request):
if request.user.is_anonymous:
data = RegisterationSerializer(data=request.data)
if data.is_valid(raise_exception=True):
validated_data = data.validated_data
del(validated_data["repeated_password"])
user = User.objects.create_user(**validated_data)
verification_code = give_code()
VerficationCode.objects.create(user=user, code=verification_code)
send_mail("Verification Code", f"your code is: {verification_code}", "nima@gmail.com", [data.validated_data["email"]])
return Response({
"message": f'{data.validated_data["email"]} account was created successfully, your verification code has been sent to your email'
}, status=status.HTTP_201_CREATED)
else:
return Response(data.errors, status=status.HTTP_400_BAD_REQUEST)
else:
return Response({
"message": "You're already authorized"
}, status=status.HTTP_400_BAD_REQUEST)
class ConfirmCodeApiView(APIView):
def post(self, request):
data = ConfirmCodeSerializer(data=request.data)
if data.is_valid():
user = User.objects.get(email=data.validated_data["email"])
if user.is_active:
return Response({
"message": "Your account is already confirmed"
}, status=status.HTTP_400_BAD_REQUEST)
else:
code = VerficationCode.objects.get(user=user)
if code.code == data.validated_data["code"] and VerficationCode.objects.nonexpired().filter(user=user).exists():
user.is_active = True
user.save()
return Response({
"message": "Your account has been confirmed"
}, status=status.HTTP_200_OK)
else:
return Response({
"message": "Your code is incorrect or expired"
}, status=status.HTTP_400_BAD_REQUEST)
else:
return Response(data.errors, status=status.HTTP_400_BAD_REQUEST)
Большое спасибо!
Вы можете добавить новое поле (столбец) в вашу модель пользователя :
email_verified = models.BooleanField(default=False)
при регистрации проверьте, существует ли данный email уже в вашей базе данных или нет. если он не существует, это будет обычная регистрация, но если существует, проверьте, является ли email_verified истинным или ложным .
если это True, то регистрация вызовет ошибку запроса, так как электронная почта уже существует, но если это false, то пользователь не использовал код для верификации своего аккаунта .
повторная отправка проверочного кода при таких обстоятельствах . поэтому каждый раз, когда пользователь пытается зарегистрироваться, эта процедура будет приводить к правильному потоку регистрации.
надеюсь, это помогло .