Flask學習第17天:Flask-cookie
一、基本概念
cookie:在網站中http請求是無狀態的。也就是說即使第一次和伺服器連線後並且登入成功後,第二次請求伺服器依然不能知道當前請求是哪個使用者。cookie出現就是為了解決這個問題,第一次登入後伺服器返回一些資料(cookie)給瀏覽器,然後瀏覽器儲存在本地,當該使用者傳送第二次請求的時候,就會把上次請求儲存的cookie資料自動的攜帶給伺服器,伺服器通過瀏覽器攜帶的資料就能判斷當前是哪個使用者了。cookie儲存的資料量有限,不同的瀏覽器有不同的儲存大小,但一般不超過4kb。因此使用cookie只能儲存一些小量的資料。
session:session和cookie的作用有點類似,都是為了儲存使用者相關的資訊。不同的是cookie是儲存在本地瀏覽器,而session儲存在伺服器。儲存在伺服器的資料會更加安全,不容易被竊取。但儲存在伺服器也有一定的弊端,就是會佔用伺服器的資源。
cookie和session結合使用:cookie和session的使用已經出現了一些非常成熟的方案。一般有兩種儲存方式
- 儲存在服務端:通過cookie儲存一個session_id,然後具體的資料則儲存在session中。如果使用者已經登入,則伺服器會在cookie中儲存一個session_id,下次再請求的時候,會把該session_id攜帶上,伺服器根據session_id在sesson庫中獲取使用者的session資料。就能知道該使用者到底是誰,以及之前儲存的一些狀態資訊。這種專業術語叫做 server side session.
- 將session資料加密,然後儲存在cookie中。這種專業術語叫做 client side session。flask採用的就是這種方式,但是也可以替換成其它方式。
二、Flask設定和刪除cookie
1、設定cookie
設定cookie應該在Response的物件上設定, flask.Response物件有一個set_cookie方法,可以通過這個方法來設定cookie資訊。
- key:鍵
- value:值
- max_age:設定過期時間(秒)
- expires:設定過期時間,時間戳的形式(1970離現在的時間)
- path:當前主域名
- domain:子域名
- secure: 如果為True,則要使用https
- httponly: 是否允許JS訪問cookie,預設為Flase,表示允許,這是一個擴充套件的cookie標準,可能不支援所有瀏覽器
- samesite: 限制cookie 的範圍
瀏覽器訪問首頁,按F12,檢視cookie
2、刪除cookie
通過Response.delete_cookie方法,指定cookie的key,就可以刪除cookie了。
三、設定cookie的有效期
* max_age:以秒為單位,距離現在多少秒後cookie會過期。
* expires:為datetime型別。這個時間需要設定為格林尼治時間,也就是要距離北京少8個小時的時間。
* 如果max_age和expires都設定了,那麼這時候以max_age為標準。
* max_age在IE8以下的瀏覽器是不支援的。expires雖然在新版的HTTP協議中是被廢棄了,但是到目前為止,所有的瀏覽器都還是能夠支援,所以如果想要相容IE8以下的瀏覽器,那麼應該使用expires,否則可以使用max_age。
* 預設的過期時間:如果沒有顯示的指定過期時間,那麼這個cookie將會在瀏覽器關閉後過期。
from flask import Flask,request,Response app = Flask(__name__) @app.route('/') def hello_world(): resp = Response("設定cookie") # 1.使用expires引數,就必須使用格林尼治時間 # 通過expires引數設定有效期的時候,就要相對北京時間少8個小時,所有這裡hours是16, # 如果直接days=31,就不準確了 expires = datetime.now() + timedelta(days=30,hours=16) resp.set_cookie('username','derek',expires=expires) # 2.使用max_age引數設定過期時間(1分鐘後後期) # resp.set_cookie('username','derek',max_age=60) return resp
四、設定cookie的有效域名
flask如何配置子域名請 進入子域名配置
cookie預設是隻能在主域名下使用。如果想要在子域名下使用,那麼應該給`set_cookie`傳遞一個`domain='.heboan.com'`,這樣其他子域名才能訪問到這個cookie資訊。