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是一個“推”的協議(發送郵件),它不允許從遠程服務器上“拉”來消息(接收郵件)。要接收郵件,客戶端必須使用POP3IMAP

設置好後就可以開啓服務器測試了。

點擊登錄頁面:

點擊最後一行的鏈接“這裏”:

按照要求輸入用戶名或者Email,點擊確認按鈕:

提示已經把重置密碼的鏈接發到郵箱中了。

前往Email中查看新郵件:

居然神奇的收到了郵件!繼續點擊郵件中的鏈接:

按照提示輸入新密碼後:

密碼重置就成功了。

嘗試一下新密碼登錄是沒問題的,順利完成了任務。

篇幅關係就沒有去挨個覆寫原有的模板文件了。如果有興趣可以仔細閱讀官方文檔,嘗試去改寫模板文件,讓頁面更加匹配自己網站的風格。

官方文檔在這裏:docs

GitHub:django-password-reset

相信讀者也嚐到使用三方庫的甜頭了:**只需要寫很少的代碼,就可以完成大量的功能。**筆者是推薦在開發中多使用優秀的三方庫的,可以極大的提高效率,減少重複勞動。當然使用三方庫也有一些缺點,比如會因爲一知半解而維護困難、不能量身定製等。在實踐中到底用還是不用,就根據實際情況再做權衡了。

後面陸續還會介紹更多的三方庫,還是貫徹那句話:成功是站在巨人肩膀上的。

常見錯誤

發送郵件因爲涉及到了發送郵箱的相關設置和權限,所以容易出各種各樣奇怪的問題。

好比說你的發送郵箱設置是[email protected]。項目代碼都是對的,但是新浪禁止了smtp服務,那郵件也會發送不成功。如果報錯請嘗試以下方法:

  • 設置發送郵箱爲允許smtp服務
  • 檢查賬號、密碼是否正確
  • 有的發送端口需要額外的設置,嘗試更換端口
  • 更換其他服務商的郵箱

如果還不行,就請根據報錯頁面,搜索一下類似問題的解決方案了。

總結

本章學習了使用第三方庫django-password-reset,高效完成了重置密碼的功能。

下一章學習擴展並更新用戶資料。

轉載請告知作者並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章