iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

在開始今天的文章前,我們要先了解甚麼是Cookie。

甚麼是Cookie

Cookie 是存儲在客戶端瀏覽器的一小段文本信息,他的基本結構是由名稱(Name)值(Value)及其他屬性例如過期時間組成的,它可以在用戶本地保存狀態信息,例如用戶身份、購物車商品等。

舉例說明cookie的用法

  1. 用戶訪問登入頁面
    用戶首先訪問網站的登入頁面。這是一個普通的 GET 請求,瀏覽器向伺服器請求 /login 頁面。
  2. 用戶提交登入表單
    用戶在表單中輸入用戶名和密碼,然後提交表單。這是一個 POST 請求,表單數據被發送到伺服器的 /login 路由。
  3. 伺服器驗證用戶身份並設置 Cookie
    伺服器接收到表單數據後,驗證用戶名和密碼。如果驗證成功,伺服器生成一個會話 ID(例如 session_id),並將其設置為 Cookie 返回給用戶。
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        # 假設驗證成功
        if username == 'johndoe' and password == 'secret':
            response = make_response(redirect(url_for('dashboard')))
            response.set_cookie('session_id', '1234567890abcdef')
            return response
    return '''
        <form method="post">
            用戶名: <input type="text" name="username"><br>
            密碼: <input type="password" name="password"><br>
            <input type="submit" value="登入">
        </form>
    '''
  1. 瀏覽器存儲 Cookie
    瀏覽器接收到伺服器的回應後,會將 session_id Cookie 存儲起來。此後,瀏覽器在向相同域名的伺服器發送請求時,會自動附帶這個 Cookie。
  2. 用戶訪問儀表板頁面
    用戶被重定向到 /dashboard 頁面。這是一個 GET 請求,瀏覽器在請求中附帶了 session_id Cookie。
@app.route('/dashboard')
def dashboard():
    session_id = request.cookies.get('session_id')
    if session_id == '1234567890abcdef':
        return '歡迎來到儀表板,您的會話 ID 是有效的!'
    else:
        return '未經授權的訪問!'

伺服器接收到請求後,讀取並驗證 session_id Cookie。如果 Cookie 有效,返回儀表板頁面;如果無效,返回未授權的訪問信息。

設定Cookie

在Flask我們可以透過使用make_respone()函數來從視圖函數的返回值中獲得響應對象,之後可以使用響應對象的set_cookie來設置Cookie。
下面有一個簡單範例

from flask import Flask,make_response

app = Flask(__name__)

@app.route('/')
def index():
    resp = make_response('success')
    resp.set_cookie('username', 'rrrrrrrrrrrr')
    return resp

if __name__ == '__main__':
    app.run(debug = True)

我們先來看一下網頁效果
https://ithelp.ithome.com.tw/upload/images/20230920/20159225YdAvVcOtbc.png

接著我們來看一下是不是cookie是不是有設定成功
https://ithelp.ithome.com.tw/upload/images/20230920/20159225er3vl5RieP.png

再來我們來看一下程式碼吧

  1. resp = make_response('success')我們透過make_response()函數生成一個新的響應對象resp。裡面先封裝了一個字符串'success'作為響應體。
  2. 在響應對象resp上調用set_cookie()方法,來設定一個Cookie。這裡設定了一個名為'username',值為'rrrrrrrrrrr'的Cookie。
  3. 最後返回響應對象resp。Flask會自動將這個對象轉換為真正的響應返回給客戶端。

這樣當瀏覽器接收到響應後,就會根據Set-Cookie頭部信息,在本地保存一個名為username,值為rrrrrrrrrrr的Cookie。
除了剛剛看到的key跟value他其實還有很多可以設定的

參數 說明
key cookie的鍵
value cookie的值
max_age cookie被保存的時間,單位為秒
expores 具體的過期時間
path 限制cookie只在指定的路徑可用,默認為全部可用
domain 設置cookie可用的域名可用,默認是當前域名
secure 如果設為True,只有HTTPS可以用

取得Cookie

當我們能夠設定Cookie後我們也比須能夠取得Cookie的值吧!
我們可以透過訪問request對象的cookies屬性來訪問客戶單提交的Cookie訊息,Flask會將客戶端所有Cookie解析到request.cookies中,其中存儲格式為字典。
我們可以通過cookies字典的鍵來訪問單個Cookie。
接著我們在剛剛的程式碼中再加入下面的三行,不要忘了在最前面的import中多引入一個request

from flask import Flask,make_response,request

@app.route('/profile')
def profile():
    username = request.cookies.get('username') 
    return username

接著我們來看一下網頁效果吧
https://ithelp.ithome.com.tw/upload/images/20230920/20159225aZ0p1Vm4bf.png

刪除Cookie

接著我們來試試看怎麼刪除Cookie,這個應該不用多說甚麼了吧(?
我們新增這幾行程式碼

@app.route('/del')
def delete():
    resp = make_response('del success')
    resp.delete_cookie('username')
    return resp

訪問localhost:5000/del來看看是不是成功清除了username了。
https://ithelp.ithome.com.tw/upload/images/20230920/20159225EJYdV9EEnk.png
https://ithelp.ithome.com.tw/upload/images/20230920/201592254vSaskAG9X.png
可以看到username不見了,這樣就是已經成功刪除了喔!


上一篇
[Day 9]Flask Jinja2 pipe
下一篇
[Day 11] session是什麼? 如何在Flask使用session
系列文
從開始到放棄的Flask30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言