1、Cookie和Session概念
(1)cookie: 在網站中,http請求是無狀态的。也就是說即使第一次和伺服器連接配接後并且登入成功後,第二次請求伺服器依然不能知道目前請求是哪個使用者。
cookie
的出現就是為了解決這個問題,第一次登入後伺服器傳回一些資料(cookie)給浏覽器,然後浏覽器儲存在本地,當該使用者發送第二次請求的時候,就會自動的把上次請求存儲的
cookie
資料自動的攜帶給伺服器,伺服器通過浏覽器攜帶的資料就能判斷目前使用者是哪個了。cookie存儲的資料量有限,不同的浏覽器有不同的存儲大小,但一般不超過4KB。是以使用
cookie
隻能存儲一些小量的資料。
(2)session: session和cookie的作用有點類似,都是為了存儲使用者相關的資訊。不同的是,
cookie
是存儲在本地浏覽器,
session
是一個思路、一個概念、一個伺服器存儲授權資訊的解決方案,不同的伺服器,不同的架構,不同的語言有不同的實作。雖然實作不一樣,但是他們的目的都是伺服器為了友善存儲資料的。
session
的出現,是為了解決
cookie
存儲資料不安全的問題的。
session的好處:
- 敏感資料不是直接發送回給浏覽器,而是發送回給一個
伺服器将session_id
和敏感資料做一個映射存儲在session_id
(在伺服器上面)中,更加安全。session
-
可以設定過期時間,也從另一方面保護了使用者的賬戶安全。session
(3)cookie和session結合使用:
web
開發發展至今,
cookie
和
session
的使用已經出現了一些非常成熟的方案。在如今的市場或者企業裡,一般有兩種存儲方式:
- 存儲在服務端:通過
存儲一個cookie
,然後具體的資料則是儲存在session_id
中。如果使用者已經登入,則伺服器會在session
中儲存一個cookie
,下次再次請求的時候,會把該session_id
攜帶上來,伺服器根據session_id
在session_id
庫中擷取使用者的session
資料。就能知道該使用者到底是誰,以及之前儲存的一些狀态資訊。這種專業術語叫做session
。存儲在伺服器的資料會更加的安全,不容易被竊取。但存儲在伺服器也有一定的弊端,就是會占用伺服器的資源,但現在伺服器已經發展至今,一些server side session
資訊還是綽綽有餘的。session
- 将
資料加密,然後存儲在session
中。這種專業術語叫做cookie
。flask采用的就是這種方式,但是也可以替換成其他形式。client side session
2、flask中使用cookie和session
(1)cookie: 在
Flask
中操作
cookie
,是通過
response
對象來操作,可以在
response
傳回之前,通過
response.set_cookie
來設定,這個方法有以下幾個參數需要注意:
- key:設定的cookie的key。
- value:key對應的value。
- max_age:改cookie的過期時間,如果不設定,則浏覽器關閉後就會自動過期。
- expires:過期時間,應該是一個
類型。datetime
- domain:該cookie在哪個域名中有效。一般設定子域名,比如
。cms.example.com
- path:該cookie在哪個路徑下有效。
(2) session:
Flask
中的
session
是通過
from flask import session
。然後添加值
key
和
value
進去即可。并且,
Flask
中的
session
機制是将
session
資訊加密,然後存儲在
cookie
中。專業術語叫做
client side session
。
3、flask中的 session工作機制
- flask中的
機制是:把敏感資料經加密後,放入session
中,然後再把session
存放到session
中,下次請求的時候,再從浏覽器發送過來的cookie
中讀取cookie
,然後在從session
中讀取敏感資料,并進行解密,擷取最終的使用者資料。session
- flask的這種
機制可以節省伺服器的開銷,因為把所有的資訊都存儲到了用戶端(浏覽器)。session
- 安全是相對的,把
放到session
中,經過加密,也是比較安全的,這點大家可以放心使用。cookie
4、操作session
(1)session的操作方式:
- 使用
需要從flask中導入session
,以後所有和session
相關的操作都是通過這個變量來的。session
- 使用
需要設定session
,用來作為加密用的,而且這個SECRERT_KEY
如果每次伺服器啟動後都變化的話,那麼之前的SECRERT_KEY
就不能再通過目前這個session
進行解密了。SECRERT_KEY
- 操作
的時候,跟操作字典是一樣的。session
- 添加
: :session
。session['username'] = 'string'
- 删除
:session
或者session.pop('username')
。del session['username']
- 清除所有
:session
session.clear()
- 擷取
:session
session.get('username')
- 添加
(2)設定
session
的過期時間
- 如果沒有指定
的過期時間,那麼預設的就是浏覽器關閉後就自動結束session
- 如果設定了
的session
屬性為True,那麼過期時間就是預設的31天。permanent
- 自定義過期時間: 可通過個給app.config設定
來更改過期時間,這個值的資料類型是PERMANENT_SESSION_LIFETIME
類型。datetime.timedelay
示例:
# session_demo.py
from flask import Flask, session
import os # 用于下面調用urandom(N)函數随機生成N個字元。
from datetime import timedelta
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) # 24位字元
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 如果設定了session.permanent=True,沒設定這個天數的話,預設的是31天。
@app.route('/')
def index():
session['username'] = 'Aboil'
session.permanent = True # 該屬性預設的是false,為false時,預設的過期時間是浏覽器關閉後就自動結束。
return 'Hello Python!'
@app.route('/get/')
def get():
print(session.get('username')) # 擷取session['username']的值
return 'get success!'
@app.route('/delete/')
def delete():
print(session.get('username')) # 擷取session['username']的值
session.pop('username') # 删除session['username']
print(session.get('username')) # 此時會列印出None,因為前面被删除了
return 'delete success!'
@app.route('/clear/')
def clear():
print(session.get('username')) # 擷取session['username']的值
session.clear() # 删除session中的所有資料
print(session.get('username')) # 此時會列印出None,因為前面被清空了
return 'clear success!'
if __name__ == '__main__':
app.run(debug=True)
以上筆記整理自知了課堂黃勇老師講解的教學視訊《Flask架構入門到實戰開發》的第四章的内容,不足之處,望不吝賜教!