Сброс пароля в Django с помощью электронной почты с использованием REST API

Я разрабатываю сайт, используя DjangoRest и Flutter, и хочу добавить сброс пароля с помощью электронной почты.

Я знаю, что в django.contrib.auth есть представления, которые помогают при сбросе пароля (PasswordResetView, PasswordResetDoneView и т.д.). Но насколько я понимаю, они возвращают HTML файлы в качестве ответа, когда вы вызываете их в Postman.

Есть ли способ использовать те же простые в использовании представления, но вместо получения HTML-файлов получить HTTP-ответ, чтобы он мог быть вызван приложением Flutter?

С этим можно справиться в основном в два шага:

1. Один - отправить что-либо вроде OTP или Reset Link view email

2. Второй - проверить, действителен ли OTP/ссылка или нет, введя новый пароль.

Этого можно достичь с помощью простых представлений API на основе функций: Я могу продемонстрировать простейшую форму с использованием OTP для базового понимания, как вы сказали, вы используете flutter во фронтенде, и это будет легче управлять otp вместо link

Шаг 1: Добавление верхнего поля в модель пользователя. Допустим, у нас есть поле otp в модели пользователя. Позже мы используем его в целях проверки.

class CustomerUser(models.Model):
    #...
    otp = models.CharField(
        max_length=6, null=True, blank=True)
    
    # Method to Put a Random OTP in the CustomerUser table.
    def save(self, *args, **kwargs):
        number_list = [x for x in range(10)]  # Use of list comprehension
        code_items_for_otp = []

        for i in range(6):
            num = random.choice(number_list)
            code_items_for_otp.append(num)

        code_string = "".join(str(item)
                                        for item in code_items_for_otp)  # list comprehension again
        # A six digit random number from the list will be saved in top field
        self.otp = code_string
        super().save(*args, **kwargs)

Шаг:2: Функция отправки Email с OTP по запросу пользователя

@api_view(['POST'])
def reset_request(request):
    data = request.data
    email = data['email']
    user = CustomUser.objects.get(email=email)
    if CustomUser.objects.filter(email=email).exists():
        # send email with otp
        send_mail(
        'Subject here',
        f'Here is the message with {user.otp}.',
        'from@example.com',
        [user.email],
        fail_silently=False,
        )
        message = {
            'detail': 'Success Message'}
        return Response(message, status=status.HTTP_200_OK)
    else:
        message = {
            'detail': 'Some Error Message'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)

Последний шаг: Проверить OTP и сбросить пароль

@api_view(['PUT'])
def reset_password(request):
    """reset_password with email, OTP and new password"""
    data = request.data
    user = CustomUser.objects.get(email=data['email'])
    if user.is_active:
        # Check if otp is valid
        if data['otp'] == user.opt:
            if new_password != '':
                # Change Password
                user.set_password(data['password'])
                user.save() # Here user otp will also be changed on save automatically 
                return Response('any response or you can add useful information with response as well. ')
            else:
                message = {
                    'detail': 'Password cant be empty'}
                return Response(message, status=status.HTTP_400_BAD_REQUEST)
        else:
            message = {
                'detail': 'OTP did not matched'}
            return Response(message, status=status.HTTP_400_BAD_REQUEST)
    else:
        message = {
            'detail': 'Something went wrong'}
        return Response(message, status=status.HTTP_400_BAD_REQUEST)

Так что вы можете повторить это с вашим собственным подходом и легко рефакторить его. В этих примерах я использовал простые представления API, подробную информацию вы можете найти в DRF DOCS Requests and Response Section also

Так что вам совсем не обязательно использовать HTML, просто можете работать с Response, HttpResponse, как вам больше нравится.

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