TypeError: send_login_mail() получил несколько значений для аргумента 'email'

Я изучаю Celery+Reddis и пытаюсь отправить электронную почту через Celery. Я создал задачу, в которой я инкапсулировал логику отправки электронной почты. Я вызываю функцию send_login_mail и передаю аргументы ключевых слов с помощью .delay().

#views.py
class SignUpOTP(APIView):
    permission_classes = [AllowAny]
    def post(self, request):
        request_email = request.data.get("email",)
        try:
            user = User.objects.get(email__iexact = request_email)
            return Response({"status": "User is already registered."}, status=status.HTTP_403_FORBIDDEN)
        except:
            if request_email:
                    send_login_mail.delay(email=request_email, subject="[OTP] New Login for Connect App")
                    return Response({'status':'OTP sent successfully.'},status = status.HTTP_200_OK)
            else:
                return Response({"status":"Please enter an email id"},status = status.HTTP_400_BAD_REQUEST)
#tasks.py
@shared_task(bind=True)
def send_login_mail(email=None, subject="[OTP] New Login for Connect App"):

    print("Wowowofdsofsdojsdjdofdffdojodjodfdfjdoofdods\nsdfjdsfjdsofjdsojdsdsosdoosdjfosdsdfodf")
    OTP.objects.filter(otp_email__iexact = email).delete()

    otp = random.randint(100000,999999)

    msg = EmailMessage(subject, f'<div style="font-family: Helvetica,Arial,sans-serif;min-width:1000px;overflow:auto;line-height:2"><div style="margin:50px auto;width:70%;padding:20px 0"><div style="border-bottom:1px solid #eee"><a href="" style="font-size:2em;color: #FFD243;text-decoration:none;font-weight:600">Connect</a></div><p style="font-size:1.2em">Greetings,</p><p style="font-size:1.2em"> Thank you for creating an account on Connect. You can count on us for quality, service, and selection. Now, we would not like to hold you up, so use the following OTP to complete your Sign Up procedures and order away.<br><b style="text-align: center;display: block;">Note: OTP is only valid for 5 minutes.</b></p><h2 style="font-size: 1.9em;background: #FFD243;margin: 0 auto;width: max-content;padding: 0 15px;color: #fff;border-radius: 4px;">{otp}</h2><p style="font-size:1.2em;">Regards,<br/>Team Connect</p><hr style="border:none;border-top:1px solid #eee" /><div style="float:right;padding:8px 0;color:#aaa;font-size:1.2em;line-height:1;font-weight:500"><p>Connect</p><p>Boys Hostel, Near Girl Hostel AKGEC</p><p>Ghaziabad</p></div></div></div>', 'swaad.info.contact@gmail.com', (email,))
    msg.content_subtype = "html"
    msg.send()

    time_created = int(time.time())
    OTP.objects.create(otp=otp, otp_email = email, time_created = time_created)
    
    return Response({"OTP has been successfully sent to your email."})

Я неправильно использую .delay()? Я пробовал использовать .apply_async(), но все равно не смог заставить его работать.p

send_login_mail.delay(request_email) or
send_login_mail.delay(request_email, "[OTP] New Login for Connect App")

может работать без проблем.

Также нет смысла сохранять аргумент None по умолчанию email, вместо этого сделайте его позиционным аргументом.

Celery может получить два аргумента с именем email.

Обратитесь к следующей ссылке: TypeError: получено несколько значений для аргумента

Вернуться на верх