Flask高階應用03---cookie和session
前言
Session和Cookie的結合使用,一般有兩種儲存方式:
第一種: session資料儲存在客戶端: Flask採用’secure cookie’方式儲存session,即session資料是使用base64編碼後儲存在客戶端的cookie中。也就是說無須依賴第三方資料庫儲存session資料。
第二種: session資料儲存在服務端,分為以下三步驟:
步驟1: 當客戶端傳送請求到服務端的時候,服務端會校驗請求中cookie引數中的sessionid值,如果cookie中不存在sessionid則認為客戶端訪問服務端時,是發起了一個新的會話。
步驟2: 如果是新的會話,則服務端會傳遞給客戶端一個cookie,並在cookie中儲存一個新的sessionid值,並將相關資料儲存在session中。
步驟3: 客戶端下次再發送請求的時候,請求上下文物件會攜帶cookie,通過校驗cookie中的sessionid值,即可判斷是否是同一會話。
步驟4: 如果校驗會話是同一會話,則可以從session中獲取到之前儲存的資料。
訪問者的標識問題伺服器需要識別來自同一訪問者的請求。這主要是通過瀏覽器的cookie實現的。 訪問者在第一次訪問伺服器時,伺服器在其cookie中設定一個唯一的ID號——會話ID(session)。 這樣,訪問者後續對伺服器的訪問頭中將自動包含該資訊,伺服器通過這個ID號,即可區 隔不同的訪問者。
1. Cookie
概念:
a)客戶端會話技術,瀏覽器的會話技術 b)資料全部儲存在客戶端中 c)儲存使用的鍵值對結構進行儲存 特性: 支援過期時間 預設會自動攜帶本網站的cookie 不能跨域名 不能跨瀏覽器
建立:
Cookie是通過伺服器建立的Response來建立的
設定:set_cookie('key', value, max_ages='', expires='')
刪除, 有三種刪除方式
1. 直接清空瀏覽器的cookie
2. delete_cookie('key') 直接使用delete_cookie函式
3. set_cookie('key','',expires=0) 重新設定key的值為空,過期時間為0
獲取:
在每次請求中,url都會向伺服器傳遞Request,在request中可以獲取到cookie的資訊 request.cookies.get('name')
例子1,設定cookie:
import datetime
@blue.route('/setcookie/')
def set_cookie():
temp = render_template('index.html')
response = make_response(temp)
outdate=datetime.datetime.today() + datetime.timedelta(days=30)
# 設定cookie中的name的存在時長,設定為30天才過期
response.set_cookie('name','cocoococo',expires=outdate)
return response
例子2,刪除cookie中的值
@blue.route('/setcookie/')
def set_cookie():
temp = render_template('index.html')
response = make_response(temp)
# 第一種方式,通過set_cookie去刪除
response.set_cookie('name','',expires=0)
# 第二種方式,del_cookie刪除
response.del_cookie('name')
return response
例子3,獲取cookie中的值
@blue.route('/getcookie/')
def get_cookie():
name=request.cookies.get('name')
return name
2. 將session資料儲存在資料庫
flask-session是flask框架的session元件
該元件則將支援session儲存到多個地方
如:
redis:儲存資料的一種工具,五大型別。非關係型資料庫
memcached
mongodb
sqlalchmey:那資料存到資料庫表裡面
2.1 安裝
pip install flask-session
如果指定存session的型別為redis的話,需要安裝redis
pip install redis
2.2 語法
設定session:
session['key'] = value
讀取session:
result = session['key'] :如果內容不存在,將會報異常
result = session.get('key') :如果內容不存在,將返回None
刪除session:
session.pop('key')
清空session中所有資料:
session.clear()
2.2 使用
我們在初始化檔案中建立一個方法,通過呼叫該方法來獲取到Flask的app物件
def create_app():
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key' # SECRET_KEY 祕鑰
app.config['SESSION_TYPE'] = 'redis' # session型別為redis
app.config['SESSION_KEY_PREFIX'] = 'flask' # 新增字首
# 載入app的第一種方式
se = Session()
se.init_app(app=app)
#載入app的第二種方式
Session(app=app)
app.register_blueprint(blueprint=blue)
return app
2.3 案例
定義一個登陸的方法,post請求獲取到username,直接寫入到redis中,並且在頁面中展示出redis中的username
a)需要先啟動redis,開啟redis-server,使用redis-cli進入客戶端
b)定義方法
@blue.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
username = session.get('username')
return render_template('login.html', username=username)
else:
username = request.form.get('username')
session['username'] = username
return redirect(url_for('first.login'))
c)定義模板
和django的挖坑填坑方式基本雷同,詳細內容在下一篇文件中詳細說明模板
<body>
<h3>歡迎:{{ username }}</h3>
<form action="" method="POST">
使用者名稱:<input type="text" name="username" placeholder="請輸入你的名字">
<input type="submit" value="提交">
</form>
</body>
d)redis中資料
注意:我們在定義app.config的時候指定了SESSION_KEY_PREFIX為flask,表示存在session中的key都會加一個字首名flask
e) cookie和session的聯絡
訪問者在第一次訪問伺服器時,伺服器在其cookie中設定一個唯一的ID號——會話ID(session)。 這樣,訪問者後續對伺服器的訪問頭中將自動包含該資訊,伺服器通過這個ID號,即可區 隔不同的訪問者。然後根據不同的訪問者來獲取其中儲存的value值資訊。