您好,登錄后才能下訂單哦!
如何理解Flask中的Cookie與session,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
一、Cookie的使用
我們都知道,HTTP
協(xié)議是無狀態(tài)的,也就是說,在一次請求響應(yīng)結(jié)束后,服務(wù)端不會保留任何對方狀態(tài)的信息,對于某些需要保留的信息,可以通過 Cookie
技術(shù)來完成,通過在請求和響應(yīng)報文中添加 Cookie
數(shù)據(jù)來保存客戶端的狀態(tài)信息。
Web 服務(wù)器為了存儲某些數(shù)據(jù)(比如用戶信息) 而保存在瀏覽器上的小型文本數(shù)據(jù),瀏覽器會在一定時間內(nèi)保存它,在下次向該服務(wù)器發(fā)送請求時附帶這些數(shù)據(jù),Cookie
通常被用來進(jìn)行用戶會話管理(比如用戶的登錄狀態(tài)),保存用戶的一些信息。
在 Flask
中,如果想要在響應(yīng)中添加一個 cookie
,可以使用 response
對象的set_cookie()
方法。
set_ cookie()方法的參數(shù)如下:
key
:cookie
鍵名
value
:cookie
值
max_age
:cookie
被保存的時間,單位:秒
expires
:具體的過期時間
path:限制 cookie
可用的路徑,默認(rèn)為整個域名
domain
:cookie
可用的域名
secure
:設(shè)置為 True
,只有通過 HTTPS 才可使用
httponly
:設(shè)置為True
,禁止客戶端 js 獲取 cookie
具體使用如下:
@app.route('user/<name>') def user(name): response = make_response('hello {}'.format(name), 200) response.set_cookie("name", name) return response
在 Flask
中,Cookie
可以通過 request
請求對象 cookies
屬性獲取。
@app.route('/hello') def hello(): user = request.args.get('name') if not user: user = request.cookies.get("name", 'default') return 'Hello {}!'.format(user)
session
指用戶會話,會話可以用來保存當(dāng)前請求的一些狀態(tài),以便于在請求之前共享信息。session是存儲在服務(wù)端的,通過唯一標(biāo)識區(qū)分用戶 session,即 session id
,一般情況下,session id
是存在 Cookie
中的,服務(wù)端可以獲取 Cookie
中的 session id
來獲取用戶 session
。
我們了解了 Cookie
最重要的功能是用來保存客戶端用戶的狀態(tài)信息。但是存在這樣一個問題,Cookie 是保存在客戶端的,在瀏覽器中可以輕易的添加和修改 Cookie
,而且如果把用戶的狀態(tài)信息以明文的方式存儲在 Cookie
里的話,那么就可以通過偽造 Cookie 信息來偽造別人的用戶信息,從而獲取一些權(quán)限。為了避免這個問題,我們要對敏感的 Cookie 內(nèi)容進(jìn)行加密。Flask 提供了 session
對象就是用來將 Cookie 數(shù)據(jù)加密存儲的。
session
需要通過密鑰對數(shù)據(jù)進(jìn)行簽名以加密數(shù)據(jù),因此,需要先設(shè)置一個密鑰app.secret_key
,這里設(shè)置的密鑰只是一個簡單示例,在生產(chǎn)環(huán)境中,必須要隨機(jī)生成的密鑰,保證秘鑰的復(fù)雜度度和隨機(jī)性,才更安全。
# 設(shè)置密鑰 app.secret_key = 'qwertyuiop' @app.route('/user', methods=['POST', 'GET']) def user(): if request.method == 'POST': user = request.form['user_name'] session['user_name'] = request.form['user_name'] return 'Hello {}!'.format(user) else: if 'user_name' in session: return 'Hello {}!'.format(session["user_name"])
session
對象的使用就跟字典一樣,如上,用戶使用POST請求登錄后,在 session
中保存用戶名,下次再使用GET請求時,不傳遞任何信息,也可以在 session
中獲取該用戶的信息。
想要清除 session 指定信息的話,例如用戶名,可以使用 session.pop("user_name", None)
,清除全部的話可以使用session.clear()
。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。