随着技术的发展,验证用户身份的手段越来越多,指纹、面容、声纹应有尽有,但密码依然是最重要的手段。
互联网处处都有密码的身影,甚至变成了现代人的一种负担。像笔者这样的,动辄几十个账号密码,忘记其中几个简直太正常了。
本章讲如何帮助健忘症患者,重置用户密码。
安装第三方库
前面我们已经知道如何修改文章标题、正文等内容,但是密码作为验证身份的重要口令,必须以更加稳妥的方式修改。一种比较常用的方式是发送一封修改密码的邮件到用户事先绑定的邮箱里。
业务流程分析如下:
- 向用户邮箱发送包含重置密码地址的邮件。邮件的地址需要动态生成,防止不怀好意的用户从中捣乱;
- 向网站用户展示一条发送邮件成功的信息;
- 用户点击邮箱中的地址后,转入重置密码的页面;
- 向用户展示一条重置成功的信息。
上面4个步骤包含了4个视图和模板,自己写代码看来有些繁琐。
可能你会想,Django这种以开发效率著称的框架,重置密码这种常用功能是不是内置了呢?答案是肯定的。事实上内置模块的流程和上面的是完全相同的,你只需要将上面4个步骤的url
配置好就可以使用了。当然内置的模板很简陋,你可以覆写模板变成自己网站的风格。
实际上Django不仅内置了密码重置,还包括登录、登出、密码修改等功能。建议读者到一定水平后多阅读Django的源码,学习其中的编程技巧。另外这部分内容Django是用类视图写的,现在阅读可能有一定困难。
源码位置:/env/Lib/site-packages/django/contrib/auth/views.py
官方文档:Django 的验证系统
使用内置的模块似乎要简单多了,那还能不能更简单呢?确实是可以的。
Django作为优秀的Web框架,有很多优秀的第三方库(即APP)被世界各地的程序员们打包发布在网上,免费供你使用。成功从来都是站在巨人的肩膀上的,既然已经有了“轮子”,何必要自己再造一个呢。
我们这里就可以用到一个叫Django-password-reset
的第三方库。
打开虚拟环境,输入指令pip install -U django-password-reset
:
(env) E:\django_project\my_blog>pip install -U django-password-reset
Collecting django-password-reset
...
Installing collected packages: django-password-reset
Successfully installed django-password-reset-2.0
看到以上信息说明安装成功了。
快速使用
既然第三方库也是app,那肯定需要在/my_blog/settings.py
中注册了:
/my_blog/settings.py
...
INSTALLED_APPS = [
...
'password_reset', # 新增
'article',
'userprofile',
]
...
在根路由/my_blog/urls.py
中添加app的地址:
/my_blog/urls.py
...
urlpatterns = [
...
path('password-reset/', include('password_reset.urls')),
]
修改/templates/userprofile/login.html
,提供一个重置密码的入口:
/templates/userprofile/login.html
...
<div class="col-12">
...
<form method="post" action=".">
...
</form>
<!-- 新增 -->
<br>
<h5>忘记密码了?</h5>
<h5>点击<a href='{% url "password_reset_recover" %}'>这里</a>重置密码</h5>
</div>
...
邮件不能凭空产生,目前为止我们并没有配置发件邮箱的账号密码,也没有配置发送邮件的端口、发件人等信息。
因此还需要在/my_blog/settings.py
末尾添加发送邮箱的相关配置:
/my_blog/settings.py
...
# SMTP服务器,改为你的邮箱的smtp!
EMAIL_HOST = 'smtp.qq.com'
# 改为你自己的邮箱名!
EMAIL_HOST_USER = 'your_email_account@xxx.com'
# 你的邮箱密码
EMAIL_HOST_PASSWORD = 'your_password'
# 发送邮件的端口
EMAIL_PORT = 25
# 是否使用 TLS
EMAIL_USE_TLS = True
# 默认的发件人
DEFAULT_FROM_EMAIL = 'xxx的博客 <your_email_account@xxx.com>'
有读者反应,这里如果用QQ邮箱有如下问题:1. 邮箱密码不是登录密码,而是 smtp 的专门的认证码;2. 发送端口 25 可能不通,请尝试 465 或 587 端口。若还是不行,建议更换其他品牌的邮箱测试。
简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是在Internet传输Email的协议标准。
SMTP是基于文本的协议。在其之上指定了一条消息的一个或多个接收者,然后消息文本会被传输。SMTP使用TCP端口25。
SMTP是一个“推”的协议(发送邮件),它不允许从远程服务器上“拉”来消息(接收邮件)。要接收邮件,客户端必须使用POP3或IMAP。
设置好后就可以开启服务器测试了。
点击登录页面:
点击最后一行的链接“这里”:
按照要求输入用户名或者Email,点击确认按钮:
提示已经把重置密码的链接发到邮箱中了。
前往Email中查看新邮件:
居然神奇的收到了邮件!继续点击邮件中的链接:
按照提示输入新密码后:
密码重置就成功了。
尝试一下新密码登录是没问题的,顺利完成了任务。
篇幅关系就没有去挨个覆写原有的模板文件了。如果有兴趣可以仔细阅读官方文档,尝试去改写模板文件,让页面更加匹配自己网站的风格。
官方文档在这里:docs
GitHub:django-password-reset
相信读者也尝到使用三方库的甜头了:只需要写很少的代码,就可以完成大量的功能。笔者是推荐在开发中多使用优秀的三方库的,可以极大的提高效率,减少重复劳动。当然使用三方库也有一些缺点,比如会因为一知半解而维护困难、不能量身定制等。在实践中到底用还是不用,就根据实际情况再做权衡了。
后面陆续还会介绍更多的三方库,还是贯彻那句话:成功是站在巨人肩膀上的。
常见错误
发送邮件因为涉及到了发送邮箱的相关设置和权限,所以容易出各种各样奇怪的问题。
好比说你的发送邮箱设置是xxx@sina.com。项目代码都是对的,但是新浪禁止了smtp服务,那邮件也会发送不成功。如果报错请尝试以下方法:
- 设置发送邮箱为允许smtp服务
- 检查账号、密码是否正确
- 有的发送端口需要额外的设置,尝试更换端口
- 更换其他服务商的邮箱
如果还不行,就请根据报错页面,搜索一下类似问题的解决方案了。
总结
本章学习了使用第三方库django-password-reset
,高效完成了重置密码的功能。
下一章学习扩展并更新用户资料。
- 有疑问请在杜赛的个人网站留言,我会尽快回复。
- 或Email私信我:dusaiphoto@foxmail.com
- 项目完整代码:Django_blog_tutorial