OPT удалить после проверки в базе данных
Я работаю с Django и верифицировал пользователя с помощью OTP по электронной почте, а OTP сохранил в базе данных. После верификации я хочу удалить OTP из базы данных. В противном случае пользователь не верифицирует аккаунт в течение двух минут, поэтому я хочу удалить OTP из базы данных
views.py
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super().validate(attrs)
serializer = UserSerializer(self.user).data
for k, v in serializer.items():
data[k] = v
return data
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
class RegisterView(APIView):
permission_classes = [AllowAny]
def post(self, request):
try:
data = request.data
serializer = UserSerializer(data=data)
if serializer.is_valid():
serializer.save()
send_otp_via_email(serializer.data['email'])
return Response({
'status': '200',
'message': 'User registered successfully Please Check your email for verification',
'data': serializer.data
})
return Response({
'status': '400',
'message': 'User registration failed',
'data': serializer.errors
})
except Exception as e:
return Response({
'status': '400',
'message': 'User registration failed',
'data': str(e)
})
class VerifyOTP(APIView):
permission_classes = [AllowAny]
def post(self, request):
try:
data = request.data
serializer = VerifyAccountSerializer(data=data)
if serializer.is_valid():
email = serializer.data['email']
otp = serializer.data['otp']
user = User.objects.filter(email=email)
if not user.exists():
return Response({
'status': '400',
'message': 'email, user not exists',
'data': 'invalid email'
})
if user[0].otp != otp:
return Response({
'status': '400',
'message': 'something went wrong',
'data': 'invalid OTP'
})
user = user.first()
user.is_valid = True
user.save()
return Response({
'status': '200',
'message': 'Account verified',
'email': serializer.data['email'],
})
return Response({
'status': '400',
'message': 'User registration failed',
'data': serializer.errors
})
except Exception as e:
return Response({
'status': '400',
'message': 'User registration failed',
'data': str(e)
})
serializer.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'id',
'name',
'email',
'phone',
'password',
'address',
'is_valid',
]
extra_kwargs = {
'password': {'write_only': True}
}
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
class VerifyAccountSerializer(serializers.Serializer):
email = serializers.EmailField()
otp = serializers.CharField()
models.py
class User(AbstractUser):
username = models.CharField(max_length=255, null=True, blank=True)
name = models.CharField(max_length=255)
email = models.CharField(max_length=255, unique=True)
phone = models.CharField(max_length=255)
password = models.CharField(max_length=255)
address = models.CharField(max_length=500, null=True, blank=True)
is_valid = models.BooleanField(default=False)
otp = models.CharField(max_length=6, null=True, blank=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
emails.py
def send_otp_via_email(email):
subject = 'Your account verification code'
otp = random.randint(100000, 999999)
message = 'Your verification code is {}'.format(otp)
email_from = settings.EMAIL_HOST_USER
send_mail(subject, message, email_from, [email])
user_obj = User.objects.get(email=email)
user_obj.otp = otp
user_obj.save()