djoser的密码重置实现

时间:2019-01-23 08:27:06

标签: django django-rest-framework djoser

我想使用djoser来进行重置密码功能,并按照文档进行操作:

  

PASSWORD_RESET_CONFIRM_URL

     

URL到您的前端密码重设页面。它应包含{uid}和   {token}个占位符,例如#/password-reset/{uid}/{token}。你应该   传递uid和令牌以重置密码确认端点。

我已完成以下操作:

PASSWORD_RESET_CONFIRM_URL': 'reset/password/reset/confirm/{uid}/{token}',

网址

url(r'^reset/password/reset/confirm/(?P<uid>[\w-]+)/(?P<token>[\w-]+)/$', PasswordResetView.as_view(),),

查看:

class PasswordResetView(APIView):

   def get (self, request, uid, token):
       post_data = {'uid': uid, 'token': token}
       return Response(post_data)

在我的邮件中,我得到以下链接:http://127.0.0.1:8000/reset/password/reset/confirm/Mjk/538-954dccbc1b06171eff4d

很明显,我会得到:

{
"uid": "Mjk",
"token": "538-954dccbc1b06171eff4d"

}

作为我的输出,但是当用户单击邮件中的链接时,我想转到auth/password/reset/confirm

1 个答案:

答案 0 :(得分:0)

让我们先描述动作:

  1. 用户单击链接以重置密码。 reset password
  2. (根据您的设置,这里需要一个表格来获取用户名或电子邮件地址)用户输入用户名并单击Submit。
  3. 用户收到一封电子邮件,其中包含用于重置密码的链接。
  4. 该链接将打开浏览器,该浏览器包含“创建新密码”形式。
  5. 用户输入新密码并发送表格
  6. 浏览器将页面重定向到主页,并提供密码已重置的反馈。

然后您可以使用以下方法重设密码。

#template
<p>Use the form below to change your password. Your password cannot be the same as your username.</p>
<form role="form" method="post">
  {% csrf_token %}
  <input type="password" name="password1" placeholder="New Password">
  <input type="submit">
</form>

#view
from django.shortcuts import redirect, render
from djoser.conf import django_settings

def reset_user_password(request, uid, token):
    if request.POST:
        password = request.POST.get('password1')
        payload = {'uid': uid, 'token': token, 'new_password': password}

        url = '{0}://{1}{2}'.format(
            django_settings.PROTOCOL, django_settings.DOMAIN, reverse('password_reset_confirm'))

        response = requests.post(url, data=payload)
        if response.status_code == 204:
            # Give some feedback to the user. For instance:
            # https://docs.djangoproject.com/en/2.2/ref/contrib/messages/
            messages.success(request, 'Your password has been reset successfully!')
            return redirect('home')
        else:
            return Response(response.json())
    else:
        return render(request, 'templates/reset_password.html')