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')