Django 用djoser实现密码重置

Django 用djoser实现密码重置,django,django-rest-framework,djoser,Django,Django Rest Framework,Djoser,我想使用djoser重置密码功能,并按照文档: 密码\u重置\u确认\u URL 指向前端密码重置页面的URL。它应该包含{uid}和 {token}占位符,例如#/password reset/{uid}/{token}。你应该 传递uid和令牌以重置密码确认终结点 我已经做了以下工作: PASSWORD\u RESET\u CONFIRM\u URL':'RESET/PASSWORD/RESET/CONFIRM/{uid}/{token}', 网址 url(r'^reset/password

我想使用
djoser
重置密码功能,并按照文档:

密码\u重置\u确认\u URL

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

我已经做了以下工作:

PASSWORD\u RESET\u CONFIRM\u URL':'RESET/PASSWORD/RESET/CONFIRM/{uid}/{token}',

网址

url(r'^reset/password/reset/confirm/(?p[\w-]+)/(?p[\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

让我们先描述一下操作:

  • 用户单击链接重置密码
  • (这里您需要一个表单来获取用户名或电子邮件地址,具体取决于您的设置)用户输入用户名并单击提交
  • 用户收到一封带有重置密码链接的电子邮件
  • 该链接打开浏览器,其中包含“创建新密码”表单
  • 用户输入新密码并发送表单
  • 浏览器将页面重定向到主页,并提供密码已重置的反馈

  • 然后可以使用以下方法重置密码

    #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>
    

    你们是否以html页面的形式发送邮件正文?我不知道你们的意思。是否希望电子邮件中的url为
    auth/password/reset/confirm
    ?那么为什么不把它放在密码重置确认URL设置中呢?它应该可以立即工作。@Ahtisham是的,电子邮件正文是htmlpage@KamilNiski如果我在电子邮件中发送
    auth/password/reset/confirm
    ,那么我将无法获得uid和令牌来知道用户是谁。而
    auth/password/reset/confirm
    是一个
    POST
    url,其字段为
    uid
    token
    new\u password
    #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')