Drf: отправка OTP с пакетом запросов после регистрации

Я пытался создать систему проверки по смс после регистрации пользователя, но не знаю как и где разместить логику и откуда ее вызывать.

class RegisterSerializerBase(serializers.ModelSerializer):
    email = serializers.EmailField(
        required=True,
        validators=[UniqueValidator(queryset=User.objects.all())]
    )

    password = serializers.CharField(
        write_only=True, required=True, validators=[validate_password])
    password2 = serializers.CharField(write_only=True, required=True)

    class Meta:
        model = User
        fields = ('email', 'firstname', 'lastname', 'password', 'password2',
                  'phone',)
        extra_kwargs = {'password': {'write_only': True},
                        'password2': {'write_only': True},
                        'firstname': {'required': True},
                        'lastname': {'required': True},
                        }

    def validate(self, attrs):
        if attrs['password'] != attrs['password2']:
            raise serializers.ValidationError(
                {"password": "Password fields didn't match."})

        return attrs

    def create(self, validated_data):
        instance = User.objects.create(
            email=validated_data['email'],
            firstname=validated_data['firstname'],
            lastname=validated_data['lastname'],
            phone=validated_data['phone'],
            is_active='True',
            type=User.TYPES.OWNER,
        )
        instance.set_password(validated_data['password'])
        instance.save()
        return instance

#создание otp будет использовать пакет PyOtp, если это не работает

def create_otp(instance):
    S = 6
    not_unique = True
    while not_unique:
        unique_otp = ''.join(random.choices(string.digits, k=S))
        if not OTP.objects.filter(otp=unique_otp):
            OTP.objects.create(
                user=instance,
                otp=unique_otp,
            )
            not_unique = False
        return unique_otp

отправка запроса на конечную точку с OTP, чтобы она могла отправить сообщение пользователю через SMS

def send_otp(unique_otp):
    url = "https://api.telda.com.et/api/write/SendOTP"

    payload = json.dumps({
        "phone": 'number',
        "message": "125KHF",
        "iso3166Code": "et",
        "otp": unique_otp,
        "senderName": "Me",
        "remark": "gg",
        "sendDate": datetime.now
    })
    headers = {
        'accept': 'text/plain',
        'Content-Type': 'application/json',
        'Authorization': 'Basic MsXOTpPg2UghEQSfKjO8Tqcvu1Biz6KjNTAwMDkzNTY1NTIwMA=='
    }

    response = requests.request("POST", url, headers=headers, data=payload)
    return response.status_code

хотелось бы узнать лучший способ использовать код выше, чтобы отправить OTO на регистрацию, заранее спасибо

Вы можете вызвать create_otp и send_otp в методе create сериализатора.

   def create(self, validated_data):
        instance = User.objects.create(
            email=validated_data['email'],
            firstname=validated_data['firstname'],
            lastname=validated_data['lastname'],
            phone=validated_data['phone'],
            is_active='True',
            type=User.TYPES.OWNER,
        )
        instance.set_password(validated_data['password'])
        instance.save()
        unique_otp = create_otp(instance)
        send_otp(unique_otp)
        return instance
Вернуться на верх