Сброс пароля в 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, как вам больше нравится.