python flask基于cookie和session來實現(xiàn)會話控制的實戰(zhàn)代碼
http的會話控制
所謂的會話(session),就是客戶端瀏覽器和服務(wù)端網(wǎng)站之間一次完整的交互過程.
會話的開始是在用戶通過瀏覽器第一次訪問服務(wù)端網(wǎng)站開始.
會話的結(jié)束時在用戶通過關(guān)閉瀏覽器以后,與服務(wù)端斷開.
所謂的會話控制,就是在客戶端瀏覽器和服務(wù)端網(wǎng)站之間,進行多次http請求響應(yīng)之間,記錄、跟蹤和識別用戶的信息而已。
為什么要有會話控制?因為 http 是一種無狀態(tài)協(xié)議,瀏覽器請求服務(wù)器是無狀態(tài)的。
無狀態(tài):指一次用戶請求時,瀏覽器、服務(wù)器無法知道之前這個用戶做過什么,對于服務(wù)端而言,客戶端的每次請求都是一次新的請求。
無狀態(tài)原因:瀏覽器與服務(wù)器是使用 socket 套接字進行通信的,服務(wù)器將請求結(jié)果返回給瀏覽器之后,會關(guān)閉當前的 socket 連接,而且客戶端也會在處理頁面完畢之后銷毀頁面對象。
有時需要保持下來用戶瀏覽的狀態(tài),比如用戶是否登錄過,瀏覽過哪些商品等
實現(xiàn)狀態(tài)保持主要有兩種方式:
- 在客戶端存儲信息使用
Cookie(廢棄),token[jwt,oauth]
- 在服務(wù)器端存儲信息使用
Session
,數(shù)據(jù)庫
Cookie
Cookie是由服務(wù)器端生成,發(fā)送給客戶端瀏覽器,瀏覽器會將Cookie的key/value保存,下次請求同一網(wǎng)站時就隨著請求頭自動發(fā)送該Cookie給服務(wù)器(前提是瀏覽器設(shè)置為啟用cookie)。
Cookie的key/value可以由服務(wù)器端自己定義。
使用場景: 登錄狀態(tài), 瀏覽歷史, 網(wǎng)站足跡,購物車 [不登錄也可以使用購物車]
Cookie是存儲在瀏覽器中的一段純文本信息,建議不要存儲敏感信息如密碼,因為電腦上的瀏覽器可能被其它人使用
Cookie基于域名安全,不同域名的Cookie是不能互相訪問的
如訪問fuguang.com時向瀏覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時,無法訪問到fuguang.com寫的Cookie信息,只能獲取到baidu.com的Cookie信息。
瀏覽器的同源策略針對cookie也有限制作用.
當瀏覽器請求某網(wǎng)站時,瀏覽器會自動將本網(wǎng)站下所有Cookie信息隨著http請求頭提交給服務(wù)器,所以在request中可以讀取Cookie信息
1.設(shè)置cookie
設(shè)置cookie需要通過flask的Response響應(yīng)對象來進行設(shè)置,由響應(yīng)對象會提供了方法set_cookie給我們可以快速設(shè)置cookie信息。
視圖函數(shù)如下:
@app.route("/set_cookie") def set_cookie(): """設(shè)置cookie,通過response傳遞到客戶端進行保存""" response = make_response('默認首頁') response.set_cookie('username', 'jingtian') # session會話期有效,關(guān)閉瀏覽器后當前cookie就會被刪除 如果沒有設(shè)置max_age,則當前cookie變量會在瀏覽器關(guān)閉(會話結(jié)束以后被瀏覽器刪除) response.set_cookie('user', 'jigntian', max_age=30 ) # 指定有效時間,過期以后瀏覽器刪除cookie,max_age=30秒 return response
瀏覽器查看cookie
2.獲取cookie
#獲取cookie @app.route("/get_cookie") def get_cookie(): """獲取來自客戶端的cookie""" print(request.cookies) # ImmutableMultiDict([]) username = request.cookies.get('username') # 沒有值則返回None user = request.cookies.get('user') # 沒有值則返回None print(f"username={username},user={user}") # username=xiaoming,user=xiaoming return "get cookie"
瀏覽器訪問
終端打印,失效的cookie獲取不到位None
3.刪除cookie
cookie保存客戶端瀏覽器中的,所以服務(wù)端無法直接刪除cookie
要實現(xiàn)刪除cookie,只能告訴瀏覽器,cookie過期了,讓瀏覽器自動刪除
刪除cookie,重新設(shè)置cookie的時間,讓瀏覽器自己根據(jù)有效期來刪除
#刪除cookie @app.route("/del_cookie") def del_cookie(): response = make_response('del cookie') # 刪除操作肯定是在瀏覽器完成的,所以我們重置下cookie名稱的對飲有效時間為0,此時cookie的值已經(jīng)不重要了。 response.set_cookie('user', '', max_age=0) response.set_cookie('username', '', max_age=0) return response
瀏覽器訪問,課件瀏覽器cookie已被刪除
完整代碼:
from flask import Flask, make_response,request # 應(yīng)用實例對象 app = Flask(__name__) #設(shè)置cookie @app.route("/set_cookie") def set_cookie(): """設(shè)置cookie,通過response傳遞到客戶端進行保存""" response = make_response('默認首頁') response.set_cookie('username', 'jingtian') # session會話期有效,關(guān)閉瀏覽器后當前cookie就會被刪除 response.set_cookie('user', 'jigntian', max_age=30 ) # 指定有效時間,過期以后瀏覽器刪除cookie,max_age=30秒 return response #獲取cookie @app.route("/get_cookie") def get_cookie(): """獲取來自客戶端的cookie""" print(request.cookies) # ImmutableMultiDict([]) username = request.cookies.get('username') # 沒有值則返回None user = request.cookies.get('user') # 沒有值則返回None print(f"username={username},user={user}") # username=jigntian,user=jigntian return "get cookie" #刪除cookie @app.route("/del_cookie") def del_cookie(): # cookie保存客戶端瀏覽器中的,所以服務(wù)端無法直接刪除cookie # 要實現(xiàn)刪除cookie,只能告訴瀏覽器,cookie過期了,讓瀏覽器自動刪除 """刪除cookie,重新設(shè)置cookie的時間,讓瀏覽器自己根據(jù)有效期來刪除""" response = make_response('del cookie') # 刪除操作肯定是在瀏覽器完成的,所以我們重置下cookie名稱的對飲有效時間為0,此時cookie的值已經(jīng)不重要了。 response.set_cookie('user', '', max_age=0) response.set_cookie('username', '', max_age=0) return response if __name__ == '__main__': # 啟動項目的web應(yīng)用程序 app.run(host="0.0.0.0", port=5000, debug=True)
cookie各階段操作流程
Session
對于敏感、重要的信息,建議要存儲在服務(wù)器端,不能存儲在瀏覽器中,如手機號、驗證碼等信息
在服務(wù)器端進行狀態(tài)保持的方案就是Session
Session依賴于Cookie,session的ID一般默認通過cookie來保存到客戶端。名字一般叫:session
flask中的session需要加密,所以使用session之前必須配置SECRET_KEY選項,否則報錯.
如果將來希望session的生命周期延長,可以通過修改cookie中的sessionID的有效期來完成配置。
session實現(xiàn)方案
注意:一般框架都是把session數(shù)據(jù)保存到服務(wù)端,但是,flask里面的session是基于token方式存儲在客戶端的,并沒有按照傳統(tǒng)的方式保存在服務(wù)端的文件中。
session的ID存在有效期的,默認是會話期,會話結(jié)束了,session_id就廢棄了。
1.設(shè)置session
設(shè)置session視圖函數(shù)如下:
#因為falsk中的session是基于cookie加密實現(xiàn)的,所以使用之前必須設(shè)置SECRET_KEY選項
app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs' #設(shè)置session @app.route("/set_session") def set_session(): """設(shè)置session""" session['username'] = 'jingtian' session['info'] = { "name": "jingtian", "age": 16, } print(session,type(session)) return "set_session"
瀏覽器訪問,session保存到客戶端的cookie中
看下session和類型
2.設(shè)置session有效期
后端Flask跟瀏覽器交互默認情況下,session cookie會在用戶關(guān)閉瀏覽器時清除。
通過將session.permanent屬性設(shè)為True可以將session的有效期延長為31天,也可以通過操作app的配置PERMANENT_SESSION_LIFETIME來設(shè)置session過期時間。
設(shè)置有效期,需要到導包
from datetime import timedelta # 以下兩步設(shè)置過期時間 session.permanent = True # 開啟設(shè)置有效期,默認為31天后過期 app.permanent_session_lifetime = timedelta(minutes=10) return "set_session"
瀏覽器訪問,可以看到session有效期為10分鐘
4.獲取session
@app.route("/get_session") def get_session(): """獲取session""" print(session.get('username')) print(session.get('info')) return "get session"
瀏覽器訪問
終端打印session
5.刪除session
@app.route("/del_session") def del_session(): """刪除session,鍵如果不存在,則會拋出異常,所以刪除之前需要判斷鍵是否存在。""" if "username" in session: session.pop("username") if "info" in session: session.pop("info") return "del_session"
瀏覽器訪問,session被刪除
完整代碼:
from flask import Flask, session from datetime import timedelta # 應(yīng)用實例對象 app = Flask(__name__) #因為falsk中的session是基于cookie加密實現(xiàn)的,所以使用之前必須設(shè)置SECRET_KEY選項 app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs' #設(shè)置session @app.route("/set_session") def set_session(): """設(shè)置session""" session['username'] = 'jingtian' session['info'] = { "name": "jingtian", "age": 16, } print(session,type(session)) # 以下兩步設(shè)置過期時間 session.permanent = True # 開啟設(shè)置有效期,默認為31天后過期 app.permanent_session_lifetime = timedelta(minutes=10) return "set_session" #獲取session @app.route("/get_session") def get_session(): """獲取session""" print(session.get('username')) print(session.get('info')) return "get session" #刪除session @app.route("/del_session") def del_session(): """刪除session,鍵如果不存在,則會拋出異常,所以刪除之前需要判斷鍵是否存在。""" if "username" in session: session.pop("username") if "info" in session: session.pop("info") return "del_session" if __name__ == '__main__': # 啟動項目的web應(yīng)用程序 app.run(host="0.0.0.0", port=5000, debug=True)
使用過程中,session是依賴于Cookie的,所以當cookie在客戶端被刪除時,對應(yīng)的session就無法被使用了。
總結(jié):
綜上,就是falsk通過cookie和session來控制http會話的全部解析,通常我們可以用cookie和session來保持用戶登錄等,falsk持續(xù)更新中,總有適合你的?。。?/p>
到此這篇關(guān)于python flask基于cookie和session來實現(xiàn)會話控制的文章就介紹到這了,更多相關(guān)python 會話控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python pands實現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法
今天小編就為大家分享一篇python pands實現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python 抓取數(shù)據(jù)存儲到Redis中的操作
這篇文章主要介紹了Python 抓取數(shù)據(jù)存儲到Redis中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07使用Python設(shè)置,更新和獲取Excel單元格的值
Excel工作簿作為一款廣泛使用的數(shù)據(jù)管理工具,與Python相結(jié)合,可以使得自動化處理大量數(shù)據(jù)成為可能,本文將演示如何使用Python設(shè)置、更新以及獲取Excel文件中單元格的值,希望對大家有所幫助2024-10-10Python?pandas按行、按列遍歷DataFrame的幾種方式
在python的DataFrame中,因為數(shù)據(jù)中可以有多個行和列,而且每行代表一個數(shù)據(jù)樣本,我們可以將DataFrame看作數(shù)據(jù)表,那你知道如何按照數(shù)據(jù)表中的行遍歷嗎,下面這篇文章主要給大家介紹了關(guān)于Python?pandas按行、按列遍歷DataFrame的幾種方式,需要的朋友可以參考下2022-09-09Django中常用的查詢數(shù)據(jù)方法及查詢對象的條件詳解
在web 開發(fā)過程中,Django 與后臺數(shù)據(jù)庫的交互是必不可少的一項,也是實現(xiàn)業(yè)務(wù)邏輯所需數(shù)據(jù)的重要方式,這篇文章主要給大家介紹了關(guān)于Django中常用的查詢數(shù)據(jù)方法及查詢對象條件的相關(guān)資料,需要的朋友可以參考下2021-09-09