django rest框架的一个扩展,提供了一种密码重置策略
django2-rest-passwordreset的Python项目详细描述
django rest密码重置
这个python包为django rest框架提供了一个简单的密码重置策略,用户可以在其中请求密码 通过其注册的电子邮件地址重置令牌。
这个包背后的主要思想是不要对令牌如何传递给最终用户(电子邮件、文本消息等)做任何假设。 相反,这个包提供了一个可以响应的信号(例如,通过发送电子邮件或文本消息)。
这个包基本上提供了两个rest端点:
- 请求令牌
- 验证(确认)令牌(并更改密码)
快速启动
- 使用pip: 从pypi安装包
pip install django-rest-passwordreset
- 将
django_rest_passwordreset
添加到django设置文件中的INSTALLED_APPS
(在rest_framework
之后):
INSTALLED_APPS=(...'django.contrib.auth',...'rest_framework',...'django_rest_passwordreset',...)
- 这个包提供了两个端点,可以通过在您的
urls.py
中包含django_rest_passwordreset.urls
来包含这些端点,如下所示:
fromdjango.conf.urlsimporturl,includeurlpatterns=[...url(r'^api/password_reset/',include('django_rest_passwordreset.urls',namespace='password_reset')),...]
注意:您可以根据需要调整url。
终点
提供了以下端点:
reset_password
-使用email
参数请求重置密码令牌reset_password/confirm
-使用有效的token
,用户密码设置为提供的password
信号
reset_password_token_created(reset_password_token)
在生成重置密码令牌时激发pre_password_reset(user)
-在重置密码之前触发post_password_reset(user)
-重置密码后激发
发送电子邮件的示例
创建两个新的django模板:
email/user_reset_password.html
和email/user_reset_password.txt
。这些模板将包含发送给用户的电子邮件以及密码重置链接(或令牌)。 在模板中,您可以访问以下上下文变量:current_user
,username
,email
,reset_password_url
。你可以根据自己的需要随意调整。将包含django信号的以下代码添加到应用程序中(有关在何处放置信号的详细信息,请参见this part of the django documentation)。
fromdjango.dispatchimportreceiverfromdjango_rest_passwordreset.signalsimportreset_password_token_created@receiver(reset_password_token_created)defpassword_reset_token_created(sender,reset_password_token,*args,**kwargs):""" Handles password reset tokens When a token is created, an e-mail needs to be sent to the user :param sender: :param reset_password_token: :param args: :param kwargs: :return: """# send an e-mail to the usercontext={'current_user':reset_password_token.user,'username':reset_password_token.user.username,'email':reset_password_token.user.email,# ToDo: The URL can (and should) be constructed using pythons built-in `reverse` method.'reset_password_url':"http://some_url/reset/?token={token}".format(token=reset_password_token.key)}# render email textemail_html_message=render_to_string('email/user_reset_password.html',context)email_plaintext_message=render_to_string('email/user_reset_password.txt',context)msg=EmailMultiAlternatives(# title:_("Password Reset for {title}".format(title="Some website title")),# message:email_plaintext_message,# from:"noreply@somehost.local",# to:[reset_password_token.user.email])msg.attach_alternative(email_html_message,"text/html")msg.send()
- 现在您应该可以使用端点通过电子邮件地址请求密码重置令牌。 如果您想在本地测试这个,我建议使用某种伪造的mailserver(比如maildump)。
测试
请参阅文件夹tests/。基本上,所有端点都被多个 单元测试。
使用此代码段运行测试:
pip install -r requirements_test.txt python setup.py install cd tests python manage.py test