iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
Software Development

從開始到放棄的Flask系列 第 11

[Day 11] session是什麼? 如何在Flask使用session

  • 分享至 

  • xImage
  •  

什麼是session

昨天介紹完了Flask的Cookie,今天我們來看看他的好朋友Session吧。
Session這個機制是絕大多數Web應用都需要的功能,它允許在無狀態的HTTP協議下實現狀態保持,使得網頁應用能夠有效地跟蹤和管理用戶的狀態和數據。不同的Web框架和語言都提供了Session管理的工具和庫,使得開發者能夠輕鬆使用Session來實現各種功能。

Session簡介

Session機制可以儲存用戶的狀態,允許在多次請求之間保持某些數據,比如用戶登錄狀態、購物車商品等。由於HTTP協議本身是無狀態的,每次請求之間互相獨立,所以需要使用Session來維護狀態。

通常,Session數據儲存在伺服器端,每次請求時,瀏覽器會通過Cookie傳送一個Session ID,以便伺服器能夠定位到對應的Session數據。

在Flask中使用Session

在Flask中,使用Session非常方便。首先,我們需要導入session對象:

  • 導入session對象:
from flask import session
  • 然後,我們可以通過session對象存取數據,就像操作Python字典一樣:
# 存數據
session['key'] = 'value' 
# 取數據
val = session.get('key')

需要注意的是,修改Session後需要調用session.commit()提交修改,但在新建的Flask應用中,默認已經開啟了自動提交,所以一般情況下不需要手動調用。

設置Secret Key

為了確保Session數據的安全性,伺服器需要設置Secret Key作為加密密鑰。在Flask中,可以這樣配置Secret Key

app.secret_key = 'secret key'

(建議使用隨機生成的字符串作為secret key。)

Flask會使用secret key對session數據進行簽名,驗證客戶端session是否被篡改。

Session配置

Session需要存儲在服務器端,Flask默認將session存儲在服務器內存中,但在生產環境建議使用Redis、Memcached等外部session儲存方案。

Flask提供多種session儲存配置,例如:

app.config['SESSION_TYPE'] = 'redis'  # session存儲在redis中
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port=6379)

設定後session對象會自動使用對應的儲存方式。

Session使用示例

以下是一個示例,演示了如何使用Session實現登錄認證功能:

from flask import Flask, session

app = Flask(__name__)
app.secret_key = 'random string'

@app.route('/login')
def login():
    session['logged_in'] = True
    return 'Login success'

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    return 'Logout success'
    
@app.route('/profile')
def profile():
    if session.get('logged_in'):
        return 'Profile page'
    else:
        return 'User not logged in'

上面這個程式碼只是一個很簡單的範例,首先建立了一個login路由,當成功登入後會將一個logged_in的 session 變數,並返回字串 'Login success',這表示用戶已成功登入。
/logout 路由:當用戶訪問此路由時,會將名為 logged_in 的 session 變數刪除,並返回字串 'Logout success',這表示用戶已成功登出。
/profile 路由:當用戶訪問此路由時,會檢查是否存在名為 logged_in 的 session 變數。如果該變數存在且值為 True,則返回 'Profile page',表示用戶已登入並可以訪問個人資料頁面。如果該變數不存在或值為 False,則返回 'User not logged in',表示用戶未登入。
當然實際的登入並不會是這麼的簡單,今天只是示範如何將seesion可以刪除、儲存、讀取,實際應用中會需要更多的安全性跟功能喔。
通過session記錄用戶是否登錄,實現多頁面的登錄狀態驗證。

總結

Session是Web應用中不可或缺的功能之一,而Flask提供了簡單而方便的Session管理接口。然而,在生產環境中,需要特別注意加密和外部存儲等措施,以確保Session數據的安全性。掌握Session的使用方式,將有助於您開發更具功能性和安全性的Web應用程序。希望這篇教學對您有所幫助!


上一篇
[Day 10] Flask Cookie
下一篇
[Day 12] Flask Flash
系列文
從開始到放棄的Flask30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言