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