擴展之前做的project,加上單用戶登入認證才能看到網頁內容以及登出功能,並參考教程開發
最新教程在這裡: Flask 入门教程3.0 (2022/07/16發布)
目標
- 網頁供單人使用
- 輸入帳號密碼驗證後才能進入並使用網頁
前置作業
首先定義一下Model class
以儲存帳號密碼,這裡取名為User
- 密碼要存哈希值,因為存明文在資料庫非常危險
User class
繼承Flask-Login
提供的UserMixin
(需要安裝Flask-Login,之後步驟會提到)
繼承UserMixin
可以讓User class
擁有幾個屬性和方法來判斷認證狀態,最常用的是is_authenticated
,可用來判斷用戶是否已經登入,方便頁面的驗證
定義後生成一下資料庫,在env
裡輸入flask shell
,或是python
都可以
另一種辦法是直接寫一個CLI命令如下,執行重新生成資料庫的命令
使用方法為在terminal輸入(一樣在env裡): flask initdb --drop
成功後會看到: Initialized database
註冊帳號密碼
資料庫建立好之後就可以來註冊帳號密碼了,同樣也是定義一個function來建立
使用方法也是在terminal操作: flask admin
該方法調用了User class
的set_password()
因此存進資料庫的是哈希值,不是明文
登入
準備工作結束後就要替網頁加上登入功能
先在env安裝
(env) $ pip install flask-login
然後instantiate Flask-login
顧名思義是根據id加載用戶的方法
登入頁面
- 檢查帳號密碼欄位是否為空
- 驗證帳號密碼是否與資料庫的一致
- 通過後調用
login_user()
(Flask-Login
自帶的方法)登入用戶
這個方法還使用了flash()
,這是Flask
提供用來印出訊息在網頁上給使用者看到,可以想像成是print
要使用這個功能必須定義SECRET_KEY
,但要記得部署前要改為隨機字串,確保安全性
然後在CSS
和base.html
檔案加入
在{% block body %}
之上
定義完方法後定義相對應的頁面-login.html
登出
登出只要簡單幾行,至於按鈕我就放在首頁的最上面,不管美化了
認證保護
本文目標是只有登入的用戶才能使用該網頁,所以全部頁面都要保護起來,因此要在以下方法都添加上@login_required
delete()
update()
- 以及首頁,改為以下,不用
login_required
,不然會連輸帳密的地方都沒有,除非用戶自己輸入url
到login
頁面
總結
不得不說package真D方便,甚麼都幫你做好了,串接一下,設定一下就搞定了,感謝強大的網友們,以及我參考的教程,讓我沒遇到甚麼困難就實作出登入登出功能。
本文是開發單用戶的登入功能,之後可以往多用戶發展
以下附上本文修改過的檔案,沒放上來就是和這篇一樣
app.py
login.html
index.html
base.html