【 Flask 教學 】如何在 Flask 設置和操作 Cookie

在 Python Flask 中,cookie 是一種儲存在使用者瀏覽器中的小型資料塊。通常情況下,我們使用 cookie 來記錄使用者的首選設定、登錄資料以及其他與使用者相關的資訊。在 Flask 應用程式中,使用 cookie 的過程非常簡單。

要在 Flask 中設置 cookie,我們需要使用 response 物件的 set_cookie() 方法。這個方法接受以下參數:

  • key:cookie 的名稱,必須是一個字符串
  • value:cookie 的值,必須是一個字符串,默認為空字符串
  • max_age:cookie 的存活時間,以秒為單位,默認為 None

以下是一個簡單的 Flask 應用程式,演示如何設置 cookie:

1
2
3
4
5
6
7
8
9
from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def index():
resp = make_response('Setting a cookie!')
resp.set_cookie('my_cookie', 'my_value')
return resp

在上面的程式碼中,我們建立了一個名為 my_cookie 的 cookie,其值為 my_value。當使用者訪問該頁面時,他們的瀏覽器將接收到這個 cookie。

要讀取 cookie,我們可以使用 request 物件的 cookies 屬性。這個屬性是一個字典,其中包含了所有使用者瀏覽器中的 cookie。以下是一個簡單的 Flask 應用程式,演示如何讀取 cookie:

1
2
3
4
5
6
7
8
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
my_cookie = request.cookies.get('my_cookie')
return f'The value of my_cookie is {my_cookie}'

在上面的程式碼中,我們使用 request.cookies.get() 方法讀取名為 my_cookie 的 cookie。如果該 cookie 存在,它的值將被存儲在 my_cookie 變數中。否則,my_cookie 將為 None

要刪除 cookie,我們只需要設置 cookie 的 max_age 參數為 0。以下是一個簡單的 Flask 應用程式,演示如何刪除 cookie:

1
2
3
4
5
6
7
8
9
from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def index():
resp = make_response('Deleting a cookie!')
resp.set_cookie('my_cookie', '', max_age=0)
return resp

在上面的程式碼中,我們建立了一個名為 my_cookie 的 cookie,並將其 max_age 設置為 0。這意味著該 cookie 的存活時間為 0 秒,瀏覽器將立即刪除它。

使用 session

雖然 cookie 是一種非常方便的儲存使用者設置和資料的方式,但是在一些情況下,它們可能不夠安全。為了增強安全性,Flask 提供了一種名為 session 的機制,它會在伺服器端儲存使用者資料,並使用一個加密的 cookie 將使用者資料傳遞給使用者瀏覽器。以下是一個簡單的 Flask 應用程式,演示如何使用 session:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask, session

app = Flask(__name__)
app.secret_key = 'my_secret_key'

@app.route('/')
def index():
session['my_session'] = 'my_value'
return 'Setting a session!'

@app.route('/get_session')
def get_session():
my_session = session.get('my_session')
return f'The value of my_session is {my_session}'

在上面的程式碼中,我們使用 session 物件儲存使用者資料。在設置 session 時,我們可以像設置字典一樣設置 session 的鍵和值。在讀取 session 時,我們使用 session.get() 方法。需要注意的是,使用 session 時需要設置 app.secret_key 屬性,該屬性是用於加密 session 的關鍵。

使用情境

以下是使用 Python Flask 框架來實現一些使用 Cookie 的範例:

使用者身份驗證

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import Flask, request, make_response

app = Flask(__name__)

@app.route('/')
def index():
resp = make_response('Welcome!')
resp.set_cookie('user_id', '123')
return resp

@app.route('/dashboard')
def dashboard():
user_id = request.cookies.get('user_id')
if user_id == '123':
return 'Dashboard'
else:
return 'Unauthorized'

在上面的程式碼中,當使用者訪問首頁時,我們設置了一個名為 user_id 的 cookie,其值為 123。當使用者訪問儀表板頁面時,我們讀取了 user_id cookie 的值,並檢查其是否等於 123。如果相等,則返回儀表板頁面,否則返回未經授權的錯誤。

記住使用者首選設置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import Flask, request, make_response

app = Flask(__name__)

@app.route('/')
def index():
lang = request.cookies.get('lang', 'en')
resp = make_response(f'Language: {lang}')
resp.set_cookie('lang', lang)
return resp

@app.route('/set_lang/<lang>')
def set_lang(lang):
resp = make_response('Language set!')
resp.set_cookie('lang', lang)
return resp

在上面的程式碼中,我們讀取了名為 lang 的 cookie 的值,並將其用作網站的語言。如果 cookie 不存在,我們默認使用英語。當使用者訪問網站時,我們將 lang cookie 的值設置為當前語言。如果使用者訪問 /set_lang/<lang> 頁面,我們將 lang cookie 的值設置為使用者指定的語言。

記住使用者在線狀態

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Flask, request, make_response

app = Flask(__name__)

@app.route('/')
def index():
resp = make_response('Welcome!')
resp.set_cookie('online', 'true')
return resp

@app.route('/logout')
def logout():
resp = make_response('Logged out!')
resp.set_cookie('online', 'false')
return resp

在上面的程式碼中,當使用者訪問首頁時,我們設置了一個名為 online 的 cookie,其值為 true,表示使用者在線。當使用者訪問登出頁面時,我們將 online cookie 的值設置為 false,表示使用者離線。

記住使用者的購物車

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from flask import Flask, request, make_response

app = Flask(__name__)

@app.route('/')
def index():
resp = make_response('Welcome to our store!')
resp.set_cookie('cart', '')
return resp

@app.route('/add_to_cart/<item>')
def add_to_cart(item):
cart = request.cookies.get('cart')
if cart:
cart += f',{item}'
else:
cart = item
resp = make_response(f'{item} added to cart!')
resp.set_cookie('cart', cart)
return resp

@app.route('/view_cart')
def view_cart():
cart = request.cookies.get('cart')
if cart:
items = cart.split(',')
return f'Items in your cart: {", ".join(items)}'
else:
return 'Your cart is empty'

在上面的程式碼中,當使用者訪問首頁時,我們設置了一個名為 cart 的 cookie,其值為空,表示使用者的購物車是空的。當使用者訪問加入到購物車頁面時,我們讀取 cart cookie 的值,將新的項目加入到購物車中,然後更新 cart cookie 的值。當使用者訪問查看購物車頁面時,我們讀取 cart cookie 的值,並顯示購物車中的所有項目。

記住使用者的瀏覽歷史

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from flask import Flask, request, make_response

app = Flask(__name__)

@app.route('/')
def index():
resp = make_response('Welcome to our store!')
resp.set_cookie('history', '')
return resp

@app.route('/view_product/<product>')
def view_product(product):
history = request.cookies.get('history')
if history:
products = history.split(',')
if product not in products:
history += f',{product}'
else:
history = product
resp = make_response(f'Viewing product: {product}')
resp.set_cookie('history', history)
return resp

@app.route('/view_history')
def view_history():
history = request.cookies.get('history')
if history:
products = history.split

總結

在 Flask 中,使用 cookie 是一種非常簡單和方便的方式,可以儲存使用者設置和資料。在上面的教學中,我們學習了如何設置、讀取和刪除 cookie,以及如何使用 session 增強安全性。通過這些方法,我們可以更加靈活地設計 Flask 應用程式,以滿足不同的需求。

參考資料

  1. OverIQ:簡單介紹 Flask 中如何使用 set_cookie() 方法設置 cookie。

  2. GeeksforGeeks:提供 Flask cookie 的概述,並介紹如何設置和讀取 cookie。

  3. Flask documentation:官方 Flask 文件,提供全面的關於 cookie 的指南,包括如何設置、讀取、刪除 cookie,以及使用 session。

  4. Python Basics:簡單介紹在 Flask 中如何使用 make_response() 函數和 set_cookie() 方法來設置 cookie。

  5. Stack Overflow:Stack Overflow 討論串,討論了在 Flask 中設置 cookie 會面臨的問題以及如何解決。

  6. Protutorialplus:提供了如何在 Python Flask 中設置和讀取 cookie 的簡單教學。

評論