Как объединить одну функцию с другой

Простите, что спрашиваю элементарную вещь. новичок в Python и Django , Я хочу повторно отправить письмо, если OTP из PUT запроса неверен. У меня есть функция, которая отправляет письмо с otp автоматически при регистрации. Но если пользователь вводит неверный OTP, я хочу повторно отправить это письмо с новым otp, поэтому я хочу объединить sent_email_otp в функцию verifyEmail. Как я могу этого добиться?

@receiver(post_save, sender=CustomUser)
def send_email_otp(sender, instance, created, **kwargs):
    if created:
        try:
            subject = "Your email needs to be verified to use site"
            message = f'Hi, Dear {instance.name} use this following OTP to Get verified your email : OTP({instance.otpForEmail})'

            email_from = settings.EMAIL_HOST_USER
            recipient_list = [instance.email]
            send_mail(subject, message, email_from, recipient_list)
            print(f"Email Sent to {instance.email}")
        except Exception as e:
            print(e)
            print("Something Wrong at send_email_otp")


@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def verifyEmail(request, pk):

    user = CustomUser.objects.get(id=pk)

    data = request.data
    otp_to_verify = data['otpForEmail']

    if otp_to_verify == user.otpForEmail:
        user.isEmailVerified = True

        user.save()
        message = {'detail': 'Your email is now verified'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)
    else:

        message = {
            'detail': 'OTP is not valid and expired, Use New OTP which we have sent you on the email'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)

Вы не можете вызвать сигнал напрямую, если не предоставите ему ожидаемый вход.

Вам нужно будет создать еще одну функцию для отправки otp. и вызвать ее в сигнале post_save и в представлении

def send_otp(name, email, otpForEmail):
    subject = "Your email needs to be verified to use site"
    message = f'Hi, Dear {name} use this following OTP to Get verified your email : OTP({otpForEmail})'

    email_from = settings.EMAIL_HOST_USER
    recipient_list = [email]
    send_mail(subject, message, email_from, recipient_list)
    print(f"Email Sent to {email}")


@receiver(post_save, sender=CustomUser)
def send_email_otp_on_post_save(sender, instance, created, **kwargs):
    if created:
        try:
            send_otp(instance.name, instance.email, instance.otpForMail)
        except Exception as e:
            print(e)
            print("Something Wrong at send_email_otp")


@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def verifyEmail(request, pk):

    user = CustomUser.objects.get(id=pk)

    data = request.data
    otp_to_verify = data['otpForEmail']

    if otp_to_verify == user.otpForEmail:
        user.isEmailVerified = True

        user.save()
        message = {'detail': 'Your email is now verified'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)
    else:

        message = {
            'detail': 'OTP is not valid and expired, Use New OTP which we have sent you on the email'}
        send_otp(user.name, user.email, user.otpForEmail)
        return Response(message, status=status.HTTP_400_BAD_REQUEST)

Вам будет трудно настроить ту же функцию send_mail еще раз для отправки OTP, так как вы сказали, что она отправляет письмо, когда пользователь регистрируется. Так почему бы не изменить сам verifyEmail.

Во-первых, здесь не нужен экземпляр пользователя, поскольку пользователь уже аутентифицирован и у вас уже есть идентификатор пользователя.

Так что в операторе else из verifyEmail можно отправить_email без вызова функции send_email_otp().

Обновить verifyEmail до.

@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def verifyEmail(request, pk):

    user = CustomUser.objects.get(id=pk)

    data = request.data
    otp_to_verify = data['otpForEmail']

    if otp_to_verify == user.otpForEmail:
        user.isEmailVerified = True

        user.save()
        message = {'detail': 'Your email is now verified'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)
    else:
        subject = "Your email needs to be verified to use site "
        message = f'Hi, Dear {user.name} use this following OTP to Get verified your email : OTP({user.otpForEmail})'

        email_from = settings.EMAIL_HOST_USER
        recipient_list = [user.email]
        send_mail(subject, message, email_from, recipient_list)
        print(f"Email Sent to {user.email}")
        message = {
            'detail': 'OTP is not valid and expired, Use New OTP which we have sent you on the email'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)
Вернуться на верх