項(xiàng)目結(jié)構(gòu):react前端 + flask后端
問(wèn)題描述:當(dāng)我登錄后,調(diào)用session['token'] = username ,在瀏覽器的cookie看到寫入的cookie(鍵值對(duì)為session:asasjndjan);再次點(diǎn)擊登出時(shí),request.cookies.get('session')獲取到對(duì)應(yīng)的cookies,我的問(wèn)題是,根據(jù)這個(gè)cookies怎么樣獲取到之前的session,這樣就可以重新獲取到session中的username;
登錄代碼:
def login():
raw_data = request.get_data()
req_objt = json.loads(raw_data)
username = req_objt.get('username')
password = req_objt.get('password')
user = User.query.filter(User.username == username, User.password == password).first()
if user:
session['token'] = username
你上面的這些操作是不需要手動(dòng)完成的,flask會(huì)自動(dòng)幫你完成,完成的大致流程如下
# set session
# 這個(gè)時(shí)候,在返回response時(shí),會(huì)一同將服務(wù)器為該session生成cookie返回給瀏覽器供瀏覽器設(shè)置
# 瀏覽器一
flask.session['test'] = 'test1'
# 瀏覽器二
flask.session['test'] = 'test2'
# 下次瀏覽器攜帶該cookie訪問(wèn)后端時(shí),后端會(huì)根據(jù)這個(gè)cookie自動(dòng)初始化session
# 從session中取出來(lái)的值即為對(duì)應(yīng)cookie的值
# 瀏覽器一
assert 'test1' == flask.session.get('test')
# 瀏覽器二
assert 'test2' == flask.session.get('test')
上述流程的實(shí)現(xiàn),請(qǐng)參考from flask.sessions import SecureCookieSessionInterface
下面是我貼出來(lái)的部分源碼及個(gè)人理解的注釋
# 初始化session
def open_session(self, app, request):
# session是存放于服務(wù)器的,這個(gè)操作等于從服務(wù)器中獲取該服務(wù)器上的全部session
s = self.get_signing_serializer(app)
if s is None:
return None
# 獲取當(dāng)前request的session cookie
val = request.cookies.get(app.session_cookie_name)
if not val:
return self.session_class()
# session 存活時(shí)間
max_age = total_seconds(app.permanent_session_lifetime)
try:
# 本次request cookie相關(guān)session
data = s.loads(val, max_age=max_age)
return self.session_class(data)
except BadSignature:
return self.session_class()
當(dāng)然,先獲取cookie,在自己通過(guò)cookie獲取內(nèi)容的方式也是可行的,只不過(guò)對(duì)于session而言應(yīng)該是沒(méi)太大必要的。
實(shí)現(xiàn)方案建議:
# 在服務(wù)器上通過(guò)內(nèi)存、redis等,為自己想要存放的東西開(kāi)放一個(gè)存儲(chǔ)空間
# 瀏覽器請(qǐng)求進(jìn)入
# 判斷是否攜帶自定義cookie,存在取之,不存在創(chuàng)建
cookie = get_cookie() or init_cookie()
# 設(shè)置值,比如自定義的存儲(chǔ)名叫session_myself,使用dict或者redis之類的
if not session_myself:
session_myself = dict()
# 設(shè)置值
session_current = session_myself.get(cookie, {})
session_current['test'] = 'test'
# 再把cookie返回給瀏覽器即可
# 取值的方式類似
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。