1. 程式人生 > >Flask高階應用03---cookie和session

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值資訊。