Flask 操作 Cookie
上節(jié)課我們說(shuō)到網(wǎng)站為了辨別用戶身份、進(jìn)行會(huì)話跟蹤需要把一些數(shù)據(jù) (例如:登錄狀態(tài)、用戶名稱) 儲(chǔ)存在用戶本地終端上,這些數(shù)據(jù)被稱為 Cookie。說(shuō)白了 Cookie 的作用和我們的身份證差不多,我們使用身份證向警察叔叔證明自己的身份,使用 Cookie 向網(wǎng)站證明自己的身份。這節(jié)課我們就來(lái)學(xué)習(xí)下如何使用 Flask Web 框架來(lái)操作 Cookie。
1. 程序簡(jiǎn)介
1.1 程序功能
完成一個(gè) Flask 程序,提供操作 Cookie 的 3 項(xiàng)功能,如下表所示:
頁(yè)面路徑 | 功能 |
---|---|
/set_cookie | 設(shè)置一個(gè)名稱為 ‘mooc’、值為 ‘idcbgp.cn’ 的 Cookie |
/get_cooike | 在服務(wù)端獲取名稱為 ‘mooc’ 的 Cookie,并將其值返回給客戶 |
/del_cooike | 刪除名稱為 ‘mooc’ 的 Cookie |
程序有 3 個(gè)源文件構(gòu)成:
源文件 | 描述 |
---|---|
app.py | Flask 后端程序,提供操作 Cookie 的接口 |
templates/get_cookie.html | 在服務(wù)端獲取 Cookie,顯示 Cookie 的值 |
templates/js_cookie.html | 在客戶端通過(guò) Javascript 顯示 Cookie 的值 |
1.2 源程序下載
2. 模板文件 get_cookie.html
瀏覽器訪問(wèn)網(wǎng)站時(shí),每次都會(huì)把 Cookie 發(fā)送給服務(wù)端,在服務(wù)端獲取 Cookie 并返回給瀏覽器,顯示的頁(yè)面模板如下所示:
<html>
<meta charset='UTF-8'>
<title>在服務(wù)端獲取 cookie</title>
<body>
<h2>在服務(wù)端獲取 cookie: <b>{{cookie}}<b/></h2>
</body>
</html>
服務(wù)端渲染 templates/get_cookie.html 時(shí),將 Cookie 的值傳遞給頁(yè)面模板,在第 6 行,顯示 Cookie 的值。
3. 模板文件 js_cookie.html
Cookie 保存在客戶端,在客戶端可以使用 Javascript 讀取 Cookie 的值,代碼如下:
<html>
<meta charset='UTF-8'>
<title>在服務(wù)端設(shè)置 cookie</title>
<body>
<h2>在服務(wù)端設(shè)置 cookie</h2>
<h2>在客戶端通過(guò) Javascript 讀取 cookie: <b id='cookie'><b/></h2>
</body>
<script>
cookie = document.getElementById('cookie');
cookie.innerHTML = document.cookie;
</script>
</html>
在第 7 行,定義了一個(gè) id 為 ‘cookie’ 的 HTML 元素;在第 11 行,獲取 id 為 ‘cookie’ 的 HTML 元素;在第 12 行,document.cookie 是瀏覽器端保存的 cookie 值,在 id 為 ‘cookie’ 的 HTML 元素中顯示 cookie 的值。
4. 后端程序 app.py
4.1 引入相關(guān)模塊
#!/usr/bin/python3
from flask import Flask, request, Response, render_template
app = Flask(__name__)
從 flask 模塊中引入 request 對(duì)象,request.cookies 存儲(chǔ)了客戶端發(fā)送的 Cookie。
從 flask 模塊中引入 Response 類,頁(yè)面處理函數(shù)返回 Response 對(duì)象,而不是字符串。Response 對(duì)象提供了 set_cookie 和 delete_cookie 等方法用于設(shè)置 Cookie 相關(guān)的 HTTP 消息頭。
4.2 在服務(wù)端獲取 Cookie
@app.route('/get_cookie')
def get_cookie():
cookie = request.cookies.get('mooc')
return render_template('get_cookie.html', cookie = cookie)
設(shè)置訪問(wèn)頁(yè)面 /get_cookie 的處理函數(shù) get_cookie,request.cookies.get (‘mooc’) 返回請(qǐng)求中名稱為 ‘mooc’ 的 Cookie 的值,將其傳遞給頁(yè)面模板 get_cookie.html。
4.3 設(shè)置 Cookie
@app.route('/set_cookie')
def set_cookie():
html = render_template('js_cookie.html')
response = Response(html)
response.set_cookie('mooc', 'idcbgp.cn')
return response
設(shè)置訪問(wèn)頁(yè)面 /set_cookie 的處理函數(shù) set_cookie。在第 3 行,首先獲取頁(yè)面模板 js_cookie.html 的內(nèi)容;在第 4 行,通過(guò)類 Response 創(chuàng)建一個(gè) response 對(duì)象;在第 5 行,方法 respose.set_cookie () 產(chǎn)生一個(gè) HTTP 的 Set-Cookie 消息頭;在第 6 行,頁(yè)面處理函數(shù)返回 response 對(duì)象,該對(duì)象包含有 Set-Cookie 消息頭。
Flask 框架將 response 對(duì)象發(fā)送給客戶端,在返回給瀏覽器的響應(yīng)中,包含有 Set-Cookie 消息頭,瀏覽器收到這個(gè)消息頭后,會(huì)在本地存儲(chǔ) Cookie 的值。因此,在 templates/js_cookie.html 文件中,可以通過(guò) Javascript 讀取 Cookie 的值。
4.4 刪除 Cookie
@app.route('/del_cookie')
def del_cookie():
html = render_template('js_cookie.html')
response = Response(html)
response.delete_cookie('mooc')
return response
if __name__ == '__main__':
app.run(debug = True)
設(shè)置訪問(wèn)頁(yè)面 /del_cookie 的處理函數(shù) del_cookie。在第 3 行,首先獲取頁(yè)面模板 js_cookie.html 的內(nèi)容;在第 4 行,通過(guò)類 Response 創(chuàng)建一個(gè) response 對(duì)象;在第 5 行,方法 respose.delete_cookie () 產(chǎn)生一個(gè)刪除 Cookie 的消息頭;在第 6 行,頁(yè)面處理函數(shù)返回 response 對(duì)象,該對(duì)象包含有刪除 Cookie 的消息頭。
Flask 框架將 response 對(duì)象發(fā)送給客戶端,在返回給瀏覽器的響應(yīng)中,包含有刪除 Cookie 的消息頭,瀏覽器收到這個(gè)消息頭后,會(huì)在本地刪除 Cookie。因此,在 templates/set_cookie.html 文件中,通過(guò) Javascript 讀取 Cookie 的值為空。
5. 運(yùn)行程序
1. 在瀏覽器中輸入 http://localhost:5000/set_cookie,顯示如下:
在頁(yè)面 /set_cookie 的處理函數(shù)中,服務(wù)端設(shè)置了名稱為 ‘mooc’、值為 ‘idcbgp.cn’ 的 Cookie,在客戶端使用 Javascript 正確顯示出 Cookie 的值。
2. 在瀏覽器中輸入 http://localhost:5000/get_cookie,顯示如下:
在頁(yè)面 /get_cookie 的處理函數(shù)中,服務(wù)端通過(guò) request.cookies [‘imooc’] 獲取客戶端發(fā)送的 Cookie 的值,將 Cookie 的值返回給瀏覽器顯示。
3. 在瀏覽器中輸入 http://localhost:5000/del_cookie,顯示如下:
在頁(yè)面 /del_cookie 的處理函數(shù)中,服務(wù)端刪除名稱為 ‘mooc’ 的 Cookie,在客戶端使用 Javascript 顯示出 Cookie 的值為空。
6. 小結(jié)
本節(jié)講解在 Flask 中如何設(shè)置、獲取、刪除 Cookie,使用思維導(dǎo)圖概括如下:
下個(gè)小節(jié)講解在 Flask 中如何操作 Session。