隨著技術的發展,驗證使用者身份的手段越來越多,指紋、面容、聲紋應有盡有,但密碼依然是最重要的手段。
網際網路處處都有密碼的身影,甚至變成了現代人的一種負擔。像筆者這樣的,動輒幾十個賬號密碼,忘記其中幾個簡直太正常了。
本章講如何幫助健忘症患者,重置使用者密碼。
安裝第三方庫
前面我們已經知道如何修改文章標題、正文等內容,但是密碼作為驗證身份的重要口令,必須以更加穩妥的方式修改。一種比較常用的方式是傳送一封修改密碼的郵件到使用者事先繫結的郵箱裡。
業務流程分析如下:
- 向使用者郵箱傳送包含重置密碼地址的郵件。郵件的地址需要動態生成,防止不懷好意的使用者從中搗亂;
- 向網站使用者展示一條傳送郵件成功的資訊;
- 使用者點選郵箱中的地址後,轉入重置密碼的頁面;
- 向使用者展示一條重置成功的資訊。
上面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 = 'dusaiphoto@foxmail.com'
# 郵箱密碼
EMAIL_HOST_PASSWORD = '你的郵箱密碼'
# 傳送郵件的埠
EMAIL_PORT = 25
# 是否使用 TLS
EMAIL_USE_TLS = True
# 預設的發件人
DEFAULT_FROM_EMAIL = '杜賽的個人網站 <dusaiphoto@foxmail.com>'
複製程式碼
簡單郵件傳輸協議 (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
轉載請告知作者並註明出處。