Django搭建個人部落格:重置使用者密碼
隨著技術的發展,驗證使用者身份的手段越來越多,指紋、面容、聲紋應有盡有,但密碼依然是最重要的手段。
網際網路處處都有密碼的身影,甚至變成了現代人的一種負擔。像筆者這樣的,動輒幾十個賬號密碼,忘記其中幾個簡直太正常了。
本章講如何幫助健忘症患者,重置使用者密碼。
安裝第三方庫
前面我們已經知道如何修改文章標題、正文等內容,但是密碼作為驗證身份的重要口令,必須以更加穩妥的方式修改。一種比較常用的方式是 傳送一封修改密碼的郵件到使用者事先繫結的郵箱裡 。
業務流程分析如下:
- 向用戶郵箱傳送包含重置密碼地址的郵件。郵件的地址需要動態生成,防止不懷好意的使用者從中搗亂;
- 向網站使用者展示一條傳送郵件成功的資訊;
- 使用者點選郵箱中的地址後,轉入重置密碼的頁面;
- 向用戶展示一條重置成功的資訊。
上面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 = '[email protected]' # 郵箱密碼 EMAIL_HOST_PASSWORD = '你的郵箱密碼' # 傳送郵件的埠 EMAIL_PORT = 25 # 是否使用 TLS EMAIL_USE_TLS = True # 預設的發件人 DEFAULT_FROM_EMAIL = '杜賽的個人網站 <[email protected]>' 複製程式碼
簡單郵件傳輸協議 (Simple Mail Transfer Protocol, SMTP)是在Internet傳輸Email的協議標準。
SMTP是基於文字的協議。在其之上指定了一條訊息的一個或多個接收者,然後訊息文字會被傳輸。SMTP使用TCP埠25。
SMTP是一個“推”的協議(傳送郵件),它不允許從遠端伺服器上“拉”來訊息(接收郵件)。要接收郵件,客戶端必須使用 POP3 或 IMAP 。
設定好後就可以開啟伺服器測試了。
點選登入頁面:

點選最後一行的連結“這裡”:

按照要求輸入使用者名稱或者Email,點選確認按鈕:

提示已經把重置密碼的連結發到郵箱中了。
前往Email中檢視新郵件:

居然神奇的收到了郵件!繼續點選郵件中的連結:

按照提示輸入新密碼後:

密碼重置就成功了。
嘗試一下新密碼登入是沒問題的,順利完成了任務。
篇幅關係就沒有去挨個覆寫原有的模板檔案了。如果有興趣可以仔細閱讀官方文件,嘗試去改寫模板檔案,讓頁面更加匹配自己網站的風格。
官方文件在這裡: ofollow,noindex">docs
相信讀者也嚐到使用三方庫的甜頭了:**只需要寫很少的程式碼,就可以完成大量的功能。**筆者是推薦在開發中多使用優秀的三方庫的,可以極大的提高效率,減少重複勞動。當然使用三方庫也有一些缺點,比如會因為一知半解而維護困難、不能量身定製等。在實踐中到底用還是不用,就根據實際情況再做權衡了。
後面陸續還會介紹更多的三方庫,還是貫徹那句話:成功是站在巨人肩膀上的。
常見錯誤
傳送郵件因為涉及到了傳送郵箱的相關設定和許可權,所以容易出各種各樣奇怪的問題。
好比說你的傳送郵箱設定是[email protected]。專案程式碼都是對的,但是新浪禁止了smtp服務,那郵件也會發送不成功。如果報錯請嘗試以下方法:
- 設定傳送郵箱為允許smtp服務
- 檢查賬號、密碼是否正確
- 有的傳送埠需要額外的設定,嘗試更換埠
- 更換其他服務商的郵箱
如果還不行,就請根據報錯頁面,搜尋一下類似問題的解決方案了。